Aniu は新しい会社に入社したばかりです。彼の最初の仕事は、条件に基づいて注文テーブルのデータをファイルにエクスポートすることでした。Aniu は「これは簡単すぎる」と考え、すぐに次のステートメントを書いて、自分のコードは免除対象製品であることをテスターに伝えました。 声明は次のとおりです。 name='lilei' かつ create_time>'2020-01-01 00:00:00' の注文から * を選択 limit start,end 予想外に、しばらくオンラインになった後、本番環境では早期警告が発行され始め、この SQL は実行時間が 50 秒を超える低速 SQL であり、ビジネスに重大な影響を与えていることがわかりました。 1. テスト実験MySQL ページングでは、limit start、count ページング ステートメントを直接使用します。 製品制限開始、カウントから*を選択 開始ページが小さい場合、クエリのパフォーマンスの問題はありません。次のように、10、100、1000、10000 (ページあたり 20 レコード) からのページングの実行時間を見てみましょう。 積限界から * を選択 10, 20 0.016 秒 積限界から * を選択 100, 20 0.016 秒 積限界から * を選択 1000, 20 0.047 秒 積限界から * を選択 10000, 20 0.094 秒 開始レコードが増加すると時間も増加することがわかりました。これは、ページング ステートメントの制限が開始ページ番号と密接に関係していることを示しています。 製品制限400000、20から*を選択 3.229秒 最後のページの記録が出てくる時間を見てみましょう 製品制限 866613 から * を選択、20 37.44 秒 このようにページ番号が最も大きいページの場合、この時間は明らかに耐えられないほど長いです。 2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバーするインデックスを使用してページングクエリを高速化するインデックス クエリを使用するステートメントにそのインデックス列 (カバー インデックス) のみが含まれている場合、クエリが非常に高速になることは誰もが知っています。 製品制限 866613, 20 から ID を選択 クエリ時間は 0.2 秒で、すべての列をクエリするのに必要な 37.44 秒よりも約 100 倍高速です。 2.2 id>= 形式の使用:製品から*を選択 ID > =(製品制限 866613 から ID を選択、1) 制限 20 クエリ時間は 0.2 秒であり、これは質的な飛躍です。 2.3 結合の使用製品aから*を選択 JOIN (製品制限 866613, 20 から ID を選択) b ON a.ID = b.id 要約:理由を述べていないと思いますか?その理由は、select * を使用する場合、limit 600000 が直接使用され、10 回のスキャンは約 600,000 のデータであり、テーブルに 600,000 回戻る必要があるためです。つまり、パフォーマンスの大部分はランダム アクセスで消費され、最終的に 10 のデータのみが使用されることになります。最初に ID を見つけてから、関連付けによってレコードをクエリすると、インデックスが条件を満たす ID をすばやく見つけて、テーブルに 10 回戻ることができるため、はるかに高速になります。必要なデータを取得できます。 これで、MySQL ページングが制限によってどんどん遅くなる理由についての記事は終わりです。MySQL ページング制限の遅さの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Docker イメージの最適化 (1.16GB から 22.4MB)
序文デッドロックの本質はリソースの競合です。バッチ挿入の順序が一貫していないと、デッドロックに陥りや...
前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...
序文少し前に、browser-sync+gulp+gulp-nodemon を組み合わせて、本番環境...
このセクションでは、その他の重要かつ興味深い W3C アクティビティの概要を説明します。このセクショ...
序文:ある日、DockerでMySQLサービスを構築したところ、MySQLのコマンドラインで中国語の...
HTTP/1.1 プロトコルで指定されている HTTP リクエスト メソッドには、OPTIONS、...
div 要素は、HTML ドキュメント内のブロックレベル コンテンツの構造と背景を提供するために使用...
目次プロセスコミュニケーションプロセス間の双方向通信問題要約するサードパーティのデータ サプライヤー...
この記事では、jsで簡単な計算機を作成する具体的なコードを参考までに共有します。具体的な内容は次のと...
<p></p> の行間隔を設定するには、style="line-h...
echarts コンポーネントの公式ウェブサイト アドレス: https://echarts.apa...
a タグ疑似クラスの役割: 「:link」: 訪問されていないタグの状態。 「:visited」: ...
序文: Vue では、props を使用して、もともと分離されていたコンポーネントを直列に接続するこ...
CentOS でカーネル モジュールを自動的にロードするには、/etc/sysconfig/modu...
MySQL でデータやテーブルを削除するのは非常に簡単ですが、削除するとすべてのデータが消えてしまう...