SQLインデックスを作成してORDER BYのパフォーマンスを向上させる方法

StackOverflow https://stackoverflow.com/questions/1011440

質問

次のような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)の正しい使用法は、テーブルの構造に依存します

これがお役に立てば幸いです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top