この SQL を最適化する方法
SQL コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_likenum DESC limit 30
ログイン後にコピー
上記の SQL ステートメントの実行には 2 秒かかります。遅すぎます。
こうなってしまうと、実際のニーズを整理しなければなりません。
SQL コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 limit 30
ログイン後にコピー
これを実行すると、プログラムは 0.16 秒しかかかりません
ソート後に実行時間を再度取得するにはどうすればよいですか? 短い。
-----解決策-------------------------- 両方とも g_labelおよび g_likenum フィールドにはインデックスが付けられます。
------解決策--------- あなたのテストは不正確だと思いますが、理由はありませんこんなに大きな違いがあるのですね。複数回実行して平均を取りましたか?
------解決策--------- g_likenum はインデックスを使用しません
------解決策------------------ 前者のステートメントの実行は遅く、後者のステートメントの実行は遅くなります。理由は次のとおりです。後者がデータ レコードをスキャンするとき、たとえ g_label にインデックスがなくても、条件を満たすレコードが合計に含まれていれば、検索する必要があるのは 30 件だけです。データ収集 割合は特に低くなく、問題はありません。前者は機能しません。where 条件を満たすすべてのレコードを検索し、g_likenum に従ってソートして最初の 30 件を取り出す必要があります。適切なインデックスの助けがなければ、完全なテーブル スキャンが発生する可能性があります。
もちろん、問題を解決する唯一の方法は、適切なインデックスを設定することです。ただし、どのような種類のインデックスが適切であるかは、dx_gd_goods テーブルのデータ分散特性によっても異なります。たとえば、where 条件を満たすレコードの割合が十分に高く、g_likenum フィールドの区別も非常に高い場合、(g_likenum) のようなインデックスはすでに非常に優れていますが、where 条件を満たすレコードが 1 つだけである場合は、比較的小さいので、パーツが少ない場合は、(g_label, g_likenum) などのインデックスの方が良いかもしれません。
さらに、データベース (mysql など) が必ずしも想像どおりにインデックスを使用していない場合があるため、explain を使用して調査する必要があり、必要に応じてインデックス ヒントやその他の手段を介して介入することができます。
――――――――――――――――――――――――――――――
プラグインベースCSDN フォーラムから提供されています。機能を拡張するために、署名ファイル ツールを作成し、皆さんと共有します。技術的な交流は歓迎です:)
------解決策---------------------- g_likenum データは非常に集中していますか?列挙型?
------解決策--------- これは前の段落の SQL ですか?その場合、g_label と g_likenum に一致するインデックスを作成できます。mysql のバージョンは何ですか?可能であれば、パーティションを作成しますか?
------解決策--------- 話し合う はは、 幸いなことに、インデックスを強制しただけで、速度は許容範囲内で、0.7 秒で戻ります。 あまり良くありませんが、引用することは許容されます: これは前の段落の SQL ですか?その場合、g_label と g_likenum に一致するインデックスを作成できます。mysql のバージョンは何ですか?可能であれば、パーティションを作成します
------解決策--------- g_label と g_likenum に結合インデックスを構築する
------解決策--------- 話し合う 少し大きい
------解決策--------- 話し合う しつこい兄弟、 次のようなステートメントが 3 つあります。 [code=SQL] select * from dx_gd_goods where g_label > = 100101000 and g_label select * from dx_……
------解決策---------
話し合う ああ、 私は今複合体を構築したのではなく、個別に構築しました。 Quote: Quote: 少し大きい これら 2 つのフィールドの複合インデックスをすでに作成しているだけです。パーティションの作成方法がわかりません。効果は明らかですか? ただし、大きな効果がない場合は、パーティション
を削除してみてください。
------解決策------------------ 私たちにできることはこれだけです。後は最適化することが重要です移動