亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
%%PRE_BLOCK_0%%" >テーブルの作成%%PRE_BLOCK_0%%
バッチを使用挿入すると、効率が大幅に向上し、1000 アイテムごとにコミットされます。データ量が多すぎると、バッチ挿入の効率も低下します。" >データ スクリプトの作成バッチを使用挿入すると、効率が大幅に向上し、1000 アイテムごとにコミットされます。データ量が多すぎると、バッチ挿入の効率も低下します。
テスト開始 " >テスト開始
普通分頁查詢" >普通分頁查詢
相同偏移量,不同數(shù)據量" >相同偏移量,不同數(shù)據量
相同數(shù)據量,不同偏移量" >相同數(shù)據量,不同偏移量
如何優(yōu)化 " >如何優(yōu)化
優(yōu)化偏移量大問題" >優(yōu)化偏移量大問題
采用子查詢方式" >采用子查詢方式
采用 id 限定方式" >采用 id 限定方式
優(yōu)化數(shù)據量大問題" >優(yōu)化數(shù)據量大問題
ホームページ Java &#&面接の質問 インタビュアー: 1,000 萬件のデータをどのようにクエリしたのですか?

インタビュアー: 1,000 萬件のデータをどのようにクエリしたのですか?

Aug 15, 2023 pm 04:34 PM
java ジャワのインタビュー

最近、私は模擬面接や履歴書の最適化を全員に対して行っていますが、多くの人が 何千萬ものデータを見ていることがわかりました。など 面接の質問はあなたを弱くします。
おそらく、數(shù)千萬のデータを含むテーブルに遭遇したことがなく、數(shù)千萬のデータをクエリすると何が起こるかわからない人もいるでしょう。

今日は実踐的な操作を説明します。今回は、テスト用に

MySQL 5.7.26

をベースにしています。

準備データ 1,000 萬のデータがない場合はどうすればよいですか?

データがないと作れませんか?

データ作成は難しいですか?

コードは 1,000 萬を作成しますか?

それは不可能です、遅すぎるし、丸一日かかるかもしれません。データベース スクリプトを使用すると、より高速に実行できます。

テーブルの作成
CREATE TABLE `user_operation_log`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `op_data` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr6` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr7` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr8` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr9` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr10` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr11` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `attr12` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
データ スクリプトの作成バッチを使用挿入すると、効率が大幅に向上し、1000 アイテムごとにコミットされます。データ量が多すぎると、バッチ挿入の効率も低下します。
DELIMITER ;;
CREATE PROCEDURE batch_insert_log()
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE userId INT DEFAULT 10000000;
 set @execSql = 'INSERT INTO `test`.`user_operation_log`(`user_id`, `ip`, `op_data`, `attr1`, `attr2`, `attr3`, `attr4`, `attr5`, `attr6`, `attr7`, `attr8`, `attr9`, `attr10`, `attr11`, `attr12`) VALUES';
 set @execData = '';
  WHILE i<=10000000 DO
   set @attr = "&#39;測試很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長的屬性&#39;";
  set @execData = concat(@execData, "(", userId + i, ", &#39;10.0.69.175&#39;, &#39;用戶登錄操作&#39;", ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ",", @attr, ")");
  if i % 1000 = 0
  then
     set @stmtSql = concat(@execSql, @execData,";");
    prepare stmt from @stmtSql;
    execute stmt;
    DEALLOCATE prepare stmt;
    commit;
    set @execData = "";
   else
     set @execData = concat(@execData, ",");
   end if;
  SET i=i+1;
  END WHILE;

END;;
DELIMITER ;

テスト開始

私のコンピューター構成は比較的低いです: win10 標準圧力 i5、読み取りおよび書き込み約 500MB SSD

Due低構成に設定した場合、このテストの準備のみを行いましたが、3148,000 個のデータが取得され、5G のディスク (インデックスなし) を占有し、38 分間実行されました。適切なコンピューター構成を備えた學生は、テスト用に複數(shù)のポイントのデータを挿入できます
SELECT count(1) FROM `user_operation_log`

返される結果: 3148000

3 つのクエリ時間は次のとおりです:

  • 14060 ms
  • 13755 ms
  • 13447 ms

普通分頁查詢

MySQL 支持 LIMIT 語句來選取指定的條數(shù)數(shù)據, Oracle 可以使用 ROWNUM 來選取。

MySQL分頁查詢語法如下:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
  • 第一個參數(shù)指定第一個返回記錄行的偏移量
  • 第二個參數(shù)指定返回記錄行的最大數(shù)目

下面我們開始測試查詢結果:

SELECT * FROM `user_operation_log` LIMIT 10000, 10

查詢3次時間分別為:

  • 59 ms
  • 49 ms
  • 50 ms

這樣看起來速度還行,不過是本地數(shù)據庫,速度自然快點。

換個角度來測試

相同偏移量,不同數(shù)據量

SELECT * FROM `user_operation_log` LIMIT 10000, 10
SELECT * FROM `user_operation_log` LIMIT 10000, 100
SELECT * FROM `user_operation_log` LIMIT 10000, 1000
SELECT * FROM `user_operation_log` LIMIT 10000, 10000
SELECT * FROM `user_operation_log` LIMIT 10000, 100000
SELECT * FROM `user_operation_log` LIMIT 10000, 1000000

查詢時間如下:

##1000 アイテム61ms74ms60ms #10000 アイテム100000 記事##1000000 記事16219ms16889ms17081ms

從上面結果可以得出結束:數(shù)據量越大,花費時間越長

相同數(shù)據量,不同偏移量

SELECT * FROM `user_operation_log` LIMIT 100, 100
SELECT * FROM `user_operation_log` LIMIT 1000, 100
SELECT * FROM `user_operation_log` LIMIT 10000, 100
SELECT * FROM `user_operation_log` LIMIT 100000, 100
SELECT * FROM `user_operation_log` LIMIT 1000000, 100
數(shù)量初回2回目3回目
10 アイテム53ms52ms47ms
100 アイテム50ms60ms55ms
164ms180ms217ms
1609ms1741ms1764ms
偏移量第一次第二次第三次
10036ms40ms36ms
100031ms38ms32ms
1000053ms48ms51ms
100000622ms576ms627ms
10000004891ms5076ms4856ms

從上面結果可以得出結束:偏移量越大,花費時間越長

SELECT * FROM `user_operation_log` LIMIT 100, 100
SELECT id, attr FROM `user_operation_log` LIMIT 100, 100

如何優(yōu)化

既然我們經過上面一番的折騰,也得出了結論,針對上面兩個問題:偏移大、數(shù)據量大,我們分別著手優(yōu)化

優(yōu)化偏移量大問題

采用子查詢方式

我們可以先定位偏移位置的 id,然后再查詢數(shù)據

SELECT * FROM `user_operation_log` LIMIT 1000000, 10

SELECT id FROM `user_operation_log` LIMIT 1000000, 1

SELECT * FROM `user_operation_log` WHERE id >= (SELECT id FROM `user_operation_log` LIMIT 1000000, 1) LIMIT 10

查詢結果如下:

sql花費時間
第一條4818ms
第二條(無索引情況下)4329ms
第二條(有索引情況下)199ms
第三條(無索引情況下)4319ms
第三條(有索引情況下)201ms

從上面結果得出結論:

  • 第一條花費的時間最大,第三條比第一條稍微好點
  • 子查詢使用索引速度更快

缺點:只適用于id遞增的情況

id非遞增的情況可以使用以下寫法,但這種缺點是分頁查詢只能放在子查詢里面

注意:某些 mysql 版本不支持在 in 子句中使用 limit,所以采用了多個嵌套select

SELECT * FROM `user_operation_log` WHERE id IN (SELECT t.id FROM (SELECT id FROM `user_operation_log` LIMIT 1000000, 10) AS t)
采用 id 限定方式

這種方法要求更高些,id必須是連續(xù)遞增,而且還得計算id的范圍,然后使用 between,sql如下

SELECT * FROM `user_operation_log` WHERE id between 1000000 AND 1000100 LIMIT 100

SELECT * FROM `user_operation_log` WHERE id >= 1000000 LIMIT 100

查詢結果如下:

sql花費時間
第一條22ms
第二條21ms

從結果可以看出這種方式非常快

注意:這里的 LIMIT 是限制了條數(shù),沒有采用偏移量

優(yōu)化數(shù)據量大問題

返回結果的數(shù)據量也會直接影響速度

SELECT * FROM `user_operation_log` LIMIT 1, 1000000

SELECT id FROM `user_operation_log` LIMIT 1, 1000000

SELECT id, user_id, ip, op_data, attr1, attr2, attr3, attr4, attr5, attr6, attr7, attr8, attr9, attr10, attr11, attr12 FROM `user_operation_log` LIMIT 1, 1000000

查詢結果如下:

sql 花費時間
第一條 15676ms
第二條 7298ms
第三條 15960ms

この結果から、不要な列を減らすことでクエリ効率も大幅に向上することがわかります。

1 回目と 3 回目のクエリ速度はほぼ同じです。 「間違いなく文句を言います。なぜそんなに多くのフィールドを書きますか? * だけで完了です。

私の MySQL サーバーとクライアントは同じマシン上にあるので、クエリ データは似ていることに注意してください。資格のある學生はそれをテストできます。」 . MySQL とは別にクライアントをテストする

#SELECT * おいしいでしょう?

ところで、SELECT * が禁止される理由を付け加えたいと思います。シンプルで無頓著だからこそ美味しいんじゃないでしょうか?

2 つの主要なポイント:

  1. SELECT * 」を使用すると、データベースはより多くのオブジェクト、フィールド、権限、屬性、??およびその他の関連コンテンツを解析する必要があります。 . SQL ステートメントが複雑でハード解析が多い場合、データベースに大きな負荷がかかります。
  2. #ネットワーク オーバーヘッドが増加します。
    # ログや IconMD5 などの役に立たない大きなテキスト フィールドが誤って追加される場合があり、データ転送サイズが幾何級數(shù)的に増加します。特に、MySQL とアプリケーションは同じマシン上にないため、このオーバーヘッドは非常に明白です。

#

以上がインタビュアー: 1,000 萬件のデータをどのようにクエリしたのですか?の詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

vscode settings.jsonの場所 vscode settings.jsonの場所 Aug 01, 2025 am 06:12 AM

settings.jsonファイルは、ユーザーレベルまたはワークスペースレベルのパスにあり、VSCODE設定のカスタマイズに使用されます。 1。ユーザーレベルのパス:WindowsはC:\ users \\ appdata \ roaming \ code \ user \ settings.json、macos is/users //settings.json、linux is /home/.config/code/user/settings.json; 2。Workspace-Level Path:.vscode/settings Project Root Directoryの設定

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動コミットモードをオフにし、次に複數(shù)の操作を実行し、結果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複數(shù)のSQL操作を実行します。 3。すべての操作が成功した場合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場合はconn.rollback()を呼び出します。同時に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設定して部分的なロールバックを達成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお勧めします。

SpringとGuiceを使用したJavaでの依存関係のマスタリング SpringとGuiceを使用したJavaでの依存関係のマスタリング Aug 01, 2025 am 05:53 AM

依存関係の指示(di)isadesignpatternwhere objectsreceivedenciesiesedternally、setter、orfieldinoffiction.2.springframeworkusessaNnotationslike@component、@service、@autowiredwithjava Basedconfi

Python Itertoolsの組み合わせの例 Python Itertoolsの組み合わせの例 Jul 31, 2025 am 09:53 AM

itertools.combinationsは、反復可能なオブジェクトから指定された數(shù)の要素を選択するすべての非反復的な組み合わせ(無関係な順序)を生成するために使用されます。その使用には、次のものが含まれます。1。繰り返しの順序を避けるために、( 'a'、 'b')、 'a'、 'c')など、リストから2つの要素の組み合わせを選択します。 2?!窤BC」や「ABD」などの文字列の3文字の組み合わせを取り、サブシーケンス生成に適しています。 3。2つの數(shù)値の合計が1 5 = 6などのターゲット値に等しい組み合わせを見つけ、ダブルループロジックを簡素化します。組み合わせと配置の違いは、順序が重要かどうかにあります。組み合わせはABとBAを同じと見なし、順列は異なると見なされます。

Python pytestフィクスチャの例 Python pytestフィクスチャの例 Jul 31, 2025 am 09:35 AM

フィクスチャは、テスト用のプリセット環(huán)境またはデータを提供するために使用される関數(shù)です。 1. @pytest.fixtureデコレータを使用して、フィクスチャを定義します。 2。テスト関數(shù)にパラメーター形式にフィクスチャを注入します。 3。降伏前にセットアップを実行してから斷片を実行します。 4。関數(shù)、モジュールなどのスコープパラメーターを介して範囲を制御します。 5.共有フィクスチャをconftest.pyに配置して、クロスファイル共有を達成し、それによってテストの保守性と再利用性を改善します。

Java仮想マシン(JVM)內部の理解 Java仮想マシン(JVM)內部の理解 Aug 01, 2025 am 06:31 AM

thejvmenablesjavaの「writeonce、runany where "capabilitybyexcuting byteCodeThethermainComponents:1。theClassLoaderSubSystemloads、links、andinitializes.classfilesusingbootStrap、拡張、およびアプリケーションクラスローロー、

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時刻を取得します。 3。of()メソッドを使用して特定の日付と時刻を作成します。 4.プラス/マイナスメソッドを使用して、時間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります?,F(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Google Chromeはローカルファイルを開くことができません Google Chromeはローカルファイルを開くことができません Aug 01, 2025 am 05:24 AM

chromecanopenlocalfileslikehtmlandpdfsbyusing "openfile" ordraggingthemintotheblowser;

See all articles