2009-06-18 2 views
1

BY ORDERを向上させるためのSQLインデックスを作成する方法:私は最初の「状態」欄で、4つのテーブルを結合して、結果を順序付けする次のようないくつかのSQL持っているパフォーマンス

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」列にPRIMARY KEYが設定されています。

このように、「ステータス」列を含む表にインデックスを追加する必要があることはわかりますが、それ以外に何を含める必要がありますか? 「入札」、「cid」、「did」もそこにあるべきですか?

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

事前のおかげで、

ジェイク(noobの)

答えて

4

私はエンジンがシークの代わりに全面的にスキャンを行っているので、それは遅いと言います。代わりにSELECT a。*をするつもりでしたか? SELECT *はa。*、b。*、c。*、d。*と等価です。

あなたはこれらの列のそれぞれに別のインデックスを置く場合は、おそらくより良い結果を得るでしょう:

  • a.did(ようa.did =「XXX」はまた、代わりにスキャンの追求でありますa.cid = c.idためa.did = d.id)
  • a.cid()
  • a.id = b.aidためb.aid()

は、あなたが試みることができるのに役立ちますステータスを第1および第2のインデックスにASCENDINGオーダーで追加してパフォーマンスを向上させるt。

+0

SQLは何の簡易版だったのに役立ちます。sの使用中に混乱を避ける。 実際には、それぞれのテーブルから特定の列をいくつか選択して、実際には「*」を使用しません。 3つのインデックスを追加してどのように動くかをお試しください。 –

+0

Brilliant!出来た。 0.4秒から0.001秒になった!それより公平なことは言えません! 私は、あなたがサムを示唆するように、それらを広げるのではなく、1つのインデックスのすべての列を取得しようとしていたということでした。 私が本当に必要とするのは、最初の原則からSQLを学ぶことです。もしも私が本を読む時間があれば... ありがとう! –

+0

覚えておくと便利なヒントは、オプティマイザはインデックス内の最初のカラムの述語がある場合のみインデックスを使用することです。 – Sam

0

私は、あなたは問題が「「ORDER BY句とテーブル上の任意のインデックスの欠如であることを働いた方法として、好奇心だろう"。私は、テーブルaのインデックスがプライマリキーにあるので、これは少し疑わしいと思っています。後で言います。

クエリの性質とデータの性質について私が推測できることは、このクエリでは一般に使用するテーブルのサイズに比べて比較的少ない結果が得られると考えられます。したがって、ORDER BYは非常に安いでしょう。もちろん、これは単なる推測です。

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

クエリーのEXPLAINingの出力を投稿することが大いに役立つことが1つあります。

0

あなたは結合を試しましたか?

select *内部結合bからa.id = b.内部結合c a.cid = c.id内部結合d a.did = d.idここでa.did = 'XXX' ORDER BY a。状態

加入の正しい使用は、(外側、内側の、richt、左)テーブル

希望の構造に依存し、これは私が投稿

+0

私がやっていたことは、(ジョイント)(一種の)ものだと思っていました。自然な結合、いいえ? 内部結合で試してみましたが、依然として順序付けられていないクエリと同じ順序で表示されていました。 –

+0

両方のクエリが有効で同等です。 – Sam

+0

'join'式が最初に 'where'式に変換されるため、 'join'ではなく 'where'を使用する方がやや高速です。ここをクリックしてください:http://www.sqlite.org/optoverview.html: "結合のON節とUSING節はWHERE節の追加語句に変換されます" – tuinstoel

関連する問題