0

MySQL に次のようなクエリがあります。

SELECT t.field1, t.field2, t.field5, t.field6, t.field7 
FROM mytable as t  

WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0

order by t.field5 desc

LIMIT 0, 100;

クエリは非常に高速ではなく (10 秒)、問題は ORDER BY 部分にあるようです。その行がないと、クエリに 0.01 秒かかり、desc の代わりに ASC を使用すると約 1 秒かかります。

クエリの WHERE/ORDER BY 部分のすべてのフィールドを、クエリに表示されるのと同じ順序 (field1、field2、field3、field4、field5) でインデックスを作成しましたが、「説明」に従って使用されません。 "MySQL で。

field1 はカーディナリティがかなり高く (約 100 個の異なる値を持つ整数)、field2 と field3 は BOOLEAN であり、field5 はカーディナリティが高い文字列です (ただし、LENGTH(field5) > 0 ではカーディナリティが低くなりますか?)。

また、field5 だけにインデックスがあり、クエリが上記のように見えるときに使用される唯一のインデックスです。クエリの ORDER BY 部分を削除すると、MySQL は代わりにマルチカラム インデックスを使用します。

ここで何が欠けていますか?

編集:これが実際のSQLです:

SELECT t.shopid, t.isproduct, t.level, t.isduplicate, t.ref_id 

FROM urls as t

WHERE t.shopid = 72 AND t.isproduct = 1 AND t.visited = 0 AND LENGTH(t.url) > 0  

ORDER BY t.level desc

LIMIT 0, 100;
4

1 に答える 1

0

テーブルのサイズとデータ型を実際に知らずに、クエリのパフォーマンスを予測することは非常に困難です。Mysql オプティマイザーには、使用するインデックスを決定する独自の方法があり、これは一般的にかなり優れています。を使用して mysql にさまざまなインデックスを強制的に使用させることで、ヒット アンド トライアルを実行できますFORCE INDEX。t.url のインデックスは、明らかな理由で使用できません。

あなたが試すことができることの1つはこれです:

select t.field1, t.field2, t.field5, t.field6, t.field7 from (SELECT t.field1, t.field2, t.field5, t.field6, t.field7 FROM mytable as t WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0) t order by t.field5 desc LIMIT 0, 100;

これは一般的に推奨されませんが、出力行数がそれほど多くない場合に役立ちます。

于 2013-10-15T11:58:06.013 に答える