1

次のようなSQLがあります。これは、4つのテーブルを結合し、最初のテーブルの「ステータス」列で結果を並べ替えます。

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句があり、テーブル「a」にインデックスがないためです。

4つのテーブルすべてで、「id」列にPRIMARYKEYが設定されています。

したがって、「ステータス」列を含むインデックスをテーブルaに追加する必要があることはわかっていますが、他に何を含める必要がありますか?「bid」、「cid」、「did」もそこにあるべきですか?

私はこれを一般的なSQLの意味で尋ねようとしましたが、重要な場合、ターゲットはGearsで使用するSQLiteです。

前もって感謝します、

ジェイク(noob)

4

3 に答える 3

4

エンジンがシークではなくあちこちでスキャンを行っているため、遅いと言えます。代わりに 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 順序で最初と 2 番目のインデックスに Status を追加してみてください。害はありません。

于 2009-06-18T08:49:48.930 に答える
0

問題が「ORDERBY句とテーブル「a」のインデックスの欠如」であることがどのように解決されたかについて興味があります。後で言うように、テーブルaの主キーにインデックスがあるので、これは少し疑わしいと思います。

クエリの性質とデータの性質について推測できることを見ると、このクエリは、使用しているテーブルのサイズと比較して、通常、比較的少ない結果しか生成しないため、ORDERBYは非常に大きくなると思います。安いです。もちろん、これは単なる推測です。

インデックスがまったく役立つかどうかは、テーブルのデータに依存します。クエリオプティマイザがクエリを実行するときに使用するインデックスは、さまざまな要因に依存します。大きな要因の1つは、ルックアップから生成される結果の予想数です。

EXPLAINingの出力を投稿する場合に非常に役立つことが1つあります。

于 2009-06-18T08:30:40.933 に答える
0

ジョインを試しましたか?

select * from a internal join b on a.id = b.aid internal join c on a.cid = c.id internal join d on a.did=d.id where a.did='XXX' ORDER BY a.status

結合 (左、リッチ、内部、外部) の正しい使用法は、テーブルの構造によって異なります

お役に立てれば

于 2009-06-18T08:50:24.857 に答える