SQLインデックスを作成してORDER BYのパフォーマンスを向上させる方法
-
06-07-2019 - |
質問
次のようなSQLがあります。4つのテーブルを結合し、結果を" status"の順に並べます。最初の列:
SELECT *
FROM a, b, c, d
WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
ORDER BY a.status
動作します。ただし、遅いです。これは、ORDER BY句とテーブル「quota」のインデックスがないために解決しました。
4つのテーブルすべてで、「id」にPRIMARY KEYが設定されています。列。
したがって、「ステータス」を含むインデックスをテーブルaに追加する必要があることはわかっています。列ですが、他に何を含める必要がありますか? 「入札」、「入札」、および「did」そこにもいるの?
一般的なSQLの意味でこれを確認しようとしましたが、重要な場合、ターゲットはGearsで使用するSQLiteです。
事前に感謝、
ジェイク(noob)
解決
エンジンはシークではなく場所全体でスキャンを実行しているため、遅いと言えます。代わりにSELECT a。*を実行するつもりでしたか?これも高速になります。SELECT*は、a。*、b。*、c。*、d。*と同等です。
これらの各列に個別のインデックスを配置すると、おそらくより良い結果が得られます。
- a.did(a.did = 'XXX'はスキャンではなくシークであり、a.did = d.idにも役立ちます)
- a.cid(a.cid = c.idの場合)
- b.aid(a.id = b.aidの場合)
パフォーマンスを向上させるために、ASCENDINGの順序で1番目と2番目のインデックスにStatusを追加してみてください-害はありません。
他のヒント
問題は「ORDER BY句とテーブル「a」のインデックスの欠如」であるとどのように解決したかについて興味があります。後で言うように、テーブルaの主キーのインデックスがあるため、これは少し疑わしいと思います。
クエリの性質とデータの性質について推測できることを見ると、このクエリは通常、使用しているテーブルのサイズと比較して比較的少ない結果を生成し、したがってORDER BY非常に安いでしょう。もちろん、これは単なる推測です。
インデックスがさらに役立つかどうかは、テーブル内のデータに依存しています。クエリの実行時にクエリオプティマイザーが使用するインデックスは、多くのさまざまな要因に依存します。大きな要因の1つは、ルックアップから生成される予想結果数です。
非常に役立つことの1つは、クエリのEXPLAINの出力を投稿する場合です。
結合を試みましたか?
select * a a ind join a b on a.id = b.aid inner join c a a.cid = c.id inner join d on a.did = d.id where a.did = 'XXX' ORDER BY a.status
結合(left、richt、inner、outer)の正しい使用法は、テーブルの構造に依存します
これがお役に立てば幸いです