私が次のテーブルを持っているとしましょう(それを呼びましょうmy_table
):
CREATE TABLE `my_table` (
`table_id` int(10) unsigned NOT NULL auto_increment,
`my_field` int(10) unsigned NOT NULL default '0'
PRIMARY KEY (`table_id`),
KEY `my_field` (`my_field`,`table_id`)
) ENGINE=MyISAM
の主キーmy_table
はtable_id
(auto_increment)であり、とのキーもmy_field
ありtable_id
ます。
このクエリをテストすると...
EXPLAIN SELECT * FROM my_table
WHERE my_field = 28
ORDER BY table_id DESC;
...私は得る:
idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra --- ----------- -------- ---- ------------- -------- --- ---- ----- ---- ----- 1 SIMPLE my_table ref my_field my_field 8 const 36
正しいキー()を使用していることがわかりますmy_field
。
しかし、これを試してみると...
EXPLAIN SELECT * FROM my_table
WHERE my_field IN (1, 28, 20)
ORDER BY table_id DESC;
...私は得る:
idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra --- ----------- -------- ---- ------------- ------ ----- -------- ---- --------------------------- 1 SIMPLE my_table ALL my_field(NULL)(NULL)(NULL)406ここでの使用; filesortの使用
キーをまったく使用していないことがわかります。さらに悪いことに、filesortを使用していることがわかります。
" FORCE INDEX (my_field)
"を実行しても、ファイルソートは実行されます。
ファイルソートを回避する方法はありますか?