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;