2011-07-12 9 views
3

このクエリではfilesortを避けるために助けが必要です。このmysqlクエリのfilesortを避ける方法

SELECT id 
    FROM articles USE INDEX(group) 
    WHERE type = '4' 
    AND category = '161' 
    AND did < '10016' 
    AND id < '9869788' 
ORDER BY id DESC 
    LIMIT 10 

INDEX(群)がfilesortレコードが行われ、そのためORDER BY id DESCの(typecategorydidid

の被覆率です。そのようなクエリのためにfilesortを避ける方法はありますか?

+0

すべての列のデータ型が数値(例:int)ですか?その場合は、クエリ内のすべての数字の周りの引用符を削除します。これは物事を大幅にスピードアップさせます。 – Asaph

+0

@Asaph:暗黙的な変換は大きな問題ではありません。私は一重引用符を削除するので、彼らは間違った印象を与える(列のデータ型が数値であると仮定して) –

+0

@OMG Ponies:本当ですか?この部分のクエリーでさえ、 '<10016 'とid <' 9869788 '?ソートする数字と文字列が異なると考えてください。例えば。 1 <5 <10であるが、 '1' <'10' <'5'である。インデックスを使用することを困難にするか不可能にするか? – Asaph

答えて

4

インデックスの列の順序を変更します。インデックスは4番目の列であり、そのまま使用する準備ができていないため、ソートには役に立たない。もちろん

あなたはMySQL docsで1

平等前に不平等列を必要とするので、これは、このWHEREのための指標の有用性に影響を与え、あなたは「あなたがキーの連続しない部分にORDER BYを使用する」破ると「行をフェッチするために使用されるキーはORDER BYで使用されるキーと同じではありません」

編集:上記の私のリンクに従って、WHEREとORDER BYの両方を満たすインデックスを持つことはできません。 2つの条件で、私は別の提案

上に掲載ので、彼らは相互に排他的です:

  • は、元の索引に戻ってIDの単一列インデックスがあまりに
  • インデックスヒントを削除
  • 両方のインデックスを使用できるオプティマイザが動作することを望む(「インデックス交差」)
+0

どのようなご注文をお勧めしますか?おそらく(id、did、type、category)? – Vern

+0

@ Vern:最も一般的に使用される列は左にあり、2番目に多く使用される列は2番目の位置にあります。 –

+0

@OMG Pony:このクエリに特定のものは、どのような順序でファイルを避けるのですか? – Vern

0

dexのidと入力して、あなたのために働くはずです。 Idが一意の場合は、そのIDの主キーを作成することもできます。

オプティマイザがクエリで作成したインデックスの最初の列を使用している可能性があるため、クエリはファイルソートを使用しています。

関連する問題