国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

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

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

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

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

MySQL 5.7.26

をベースにしています。

準(zhǔn)備データ 1,000 萬(wàn)のデータがない場(chǎng)合はどうすればよいですか?

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

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

コードは 1,000 萬(wàn)を作成しますか?

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

テーブルの作成
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;測(cè)試很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)的屬性&#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 ;

テスト開始

私のコンピューター構(gòu)成は比較的低いです: win10 標(biāo)準(zhǔn)圧力 i5、読み取りおよび書き込み約 500MB SSD

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

返される結(jié)果: 3148000

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

  • 14060 ms
  • 13755 ms
  • 13447 ms

普通分頁(yè)查詢

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

MySQL分頁(yè)查詢語(yǔ)法如下:

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

下面我們開始測(cè)試查詢結(jié)果:

SELECT * FROM `user_operation_log` LIMIT 10000, 10

查詢3次時(shí)間分別為:

  • 59 ms
  • 49 ms
  • 50 ms

這樣看起來(lái)速度還行,不過(guò)是本地?cái)?shù)據(jù)庫(kù),速度自然快點(diǎn)。

換個(gè)角度來(lái)測(cè)試

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

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

查詢時(shí)間如下:

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

從上面結(jié)果可以得出結(jié)束:數(shù)據(jù)量越大,花費(fèi)時(shí)間越長(zhǎng)

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

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

從上面結(jié)果可以得出結(jié)束:偏移量越大,花費(fèi)時(shí)間越長(zhǎng)

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

如何優(yōu)化

既然我們經(jīng)過(guò)上面一番的折騰,也得出了結(jié)論,針對(duì)上面兩個(gè)問(wèn)題:偏移大、數(shù)據(jù)量大,我們分別著手優(yōu)化

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

采用子查詢方式

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

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

查詢結(jié)果如下:

sql花費(fèi)時(shí)間
第一條4818ms
第二條(無(wú)索引情況下)4329ms
第二條(有索引情況下)199ms
第三條(無(wú)索引情況下)4319ms
第三條(有索引情況下)201ms

從上面結(jié)果得出結(jié)論:

  • 第一條花費(fèi)的時(shí)間最大,第三條比第一條稍微好點(diǎn)
  • 子查詢使用索引速度更快

缺點(diǎn):只適用于id遞增的情況

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

注意:某些 mysql 版本不支持在 in 子句中使用 limit,所以采用了多個(gè)嵌套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ù)遞增,而且還得計(jì)算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

查詢結(jié)果如下:

sql花費(fèi)時(shí)間
第一條22ms
第二條21ms

從結(jié)果可以看出這種方式非???/p>

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

優(yōu)化數(shù)據(jù)量大問(wèn)題

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

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

查詢結(jié)果如下:

sql 花費(fèi)時(shí)間
第一條 15676ms
第二條 7298ms
第三條 15960ms

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

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

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

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

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

2 つの主要なポイント:

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

#

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

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

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

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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

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

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

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

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識(shí)別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採(cǎi)用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號(hào)、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

See all articles