序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク IO のオーバーヘッドが過剰になることを防ぐために、ページング表示が必要になることがよくあります。このとき、MySQL の LIMIT キーワードが必要になります。しかし、LIMIT ページングですべてがうまくいくと思いますか? まだ若すぎて単純すぎます。データ量が多い場合、LIMIT が引き起こす可能性のある問題の 1 つは、ディープ ページングです。 場合ここでは、電子商取引の注文詳細の表示を例にとります。新しいテーブルは次のようになります。 テーブル `cps_user_order_detail` を作成します ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主キー', `user_id` varchar(32) NOT NULL DEFAULT '' COMMENT 'ユーザーID', `order_id` bigint(20) デフォルト NULL コメント '注文ID', `sku_id` bigint(20) unsigned NOT NULL COMMENT '製品ID', `order_time` datetime DEFAULT NULL COMMENT '注文時間、形式 yyyy-MM-dd HH:mm:ss', 主キー (`id`)、 キー `idx_time_user` (`order_time`,`user_id`) BTREE の使用 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='ユーザー注文詳細'; 次に、120 万件のレコードを手動でテーブルに挿入します。 ここでは、以下に示すように実行プランを見てみましょう。
上の図を見ると、オフセットが異なるだけで、同じステートメントでも実行プランが大きく異なっていることがわかります (少し誇張して表現します)。最初のステートメント 最適化原因が分析されたので、実際の開発で LIMIT ディープ ページングを最適化するにはどうすればよいでしょうか。ここで 2 つの解決策を紹介します。 SELECT * FROM cps_user_order_detail d WHERE d.id > #{maxId} AND d.order_time>'2020-8-5 00:00:00' ORDER BY d.order_time LIMIT 6; 上記のコードに示されているように、これもページ分割されていますが、maxId 制限があります。これは何を意味するのでしょうか。maxId は、前のページの最大の主キー ID です。したがって、この方法を使用する前提は次のとおりです。1) 主キーは自動増分である必要があり、UUID にすることはできません。また、基本的なページング パラメータ pageNo、pageSize を渡すだけでなく、フロント エンドは前の各ページの最大 ID も取得する必要があります。2) この方法はランダムなページ ジャンプをサポートしていません。つまり、ページを上下に移動することしかできません。次の図は、有名な電子商取引会社の実際のページを示しています。 2 つ目は、Elastic Search 検索エンジン最適化 (転置インデックスに基づく) です。実際、Taobao などの電子商取引企業は、基本的にすべての製品を ES 検索エンジンに入れています (このような膨大なデータを MySQL に入れるのは不可能であり、Redis に入れるのは現実的ではありません)。しかし、ES 検索エンジンを使用しても、ディープ ページングの問題が発生する可能性があります。その場合はどうすればよいでしょうか?答えはカーソルスクロールを通じてです。この点についてはここでは詳しく説明しません。興味のある方は調べてみてください。 まとめこのブログを書いたのは、以前開発中に実際にそれを経験し、Byte のインタビューで面接官とそれについて話し合ったからです。 LIMIT の制限と最適化について知っていると、面接でそのことを伝えることができればプラスになります。MySQL の最適化はインデックスの構築と SQL の調整だけだと言わないでください (実際、実際の開発では、これら 2 つの最適化ソリューションの効果は最小限です)。結局のところ、MySQL の最適化がそれほど素晴らしいのであれば、ミドルウェアはそれほど多くないはずです。 これで、MySQL ディープ ページング (数千万のデータを素早くページ分割する方法) に関するこの記事は終了です。MySQL ディープ ページングの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: ページのレンダリング時間を短縮してページの実行速度を速めます
>>: Git サーバーを使用してデバッグ ブランチを表示し、修正する方法を 1 日 1 分で学習します。
MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...
Cocos Creator バージョン: 2.3.4デモのダウンロード: https://files...
導入悠宇希の原文です。 vite は Vue CLI に似ています。vite も、基本的なプロジェク...
シナリオ要件1. zabbix_server Web インターフェースのスクリプト機能を使用すると、...
最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...
シリアル化の実装InnoDB は 2 つの方法でシリアル化を実装します。まず、SELECT 文が明示...
序文セキュリティ上の理由から、会社が Linux サーバーへのすべてのログインにセキュリティ制限を課...
1. 構造部品1. フォームには、入力コントロール、標準フォーム フィールド、ラベル、ドロップダウン...
フォームは、get と post の 2 つのデータ転送方法を提供します。どちらもデータを送信する方...
目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...
目次キャッシュキャッシュ位置の分類キャッシュ設定ヘッダーNodeは静的ファイルキャッシュを実装する強...
ワームは、その名前が示すように、自ら複製し、その数は倍増、つまり指数関数的に増加します。 MySQL...
Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...
この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...
JavaScriptで非同期実行の結果を同期的に取得するには、 for ループ内でawaitを使用...