私は比較的大きなテーブル (5,208,387 行、400 MB データ/670 MB インデックス) を持っています。検索に使用するすべての列はインデックスです。
name
およびtype
VARCHAR(255) BTREE INDEX でsdate
あり、タイムスタンプを含む INTEGER 列です。
いくつかの問題を理解できません。まず、このクエリは非常に遅いです (5 秒):
SELECT *
FROM `mytable`
WHERE `name` LIKE 'hello%my%big%text%thing%'
AND `type` LIKE '%'
ORDER BY `sdate` DESC LIMIT 3
上記について説明します。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable range name name 257 NULL 5191 Using where
これは非常に高速ですが(5ミリ秒):
SELECT *
FROM `mytable`
WHERE `name` LIKE 'hello.my%big%text%thing%'
AND `type` LIKE '%'
ORDER BY `sdate` DESC LIMIT 3
上記について説明します。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable range name name 257 NULL 204 Using where
スキャンされる行の量の違いは、インデックスのために理にかなっていますが、5k のインデックス付きの行に 5 秒かかるのは多すぎるようです。
また、name
代わりにsdate
並べ替えると、クエリが非常に高速になりますが、タイムスタンプで並べ替える必要があります。
私が理解していない2番目のことは、最後の列をインデックスに追加する前に、データベースには1.4GBのインデックスがあり、OPTIMIZE/REPAIRを実行した後のサイズはわずか670MBであることです。