我有一个简单的表格 - >
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL
我的桌面引擎是MyISAM
。
我在combo1
by_id,posted_on,id
的多列索引
我运行此查询 - >
EXPLAIN SELECT * FROM books
WHERE by_id = '1' AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Extra
列显示Using where
,关键列显示combo1
但是,当我运行此查询时 - >
EXPLAIN SELECT * FROM books
WHERE by_id IN(1,7,10) AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Extra
列显示Using where; Using filesort
,关键列显示combo1
。
为什么在第二种情况下出现filesort
,即使QEP显示优化器正在使用索引combo1,其中包含'id'索引。
答案 0 :(得分:6)
索引是B +树。这意味着在by_id 1下有所有记录,其中包含posted_on 0和by_id 1,然后您拥有这些记录的所有ID。然而,在by_id 7下你有另一个树分支,它包含带有published_on 0的记录,它们包含带有id的记录。
当你有in子句时,你正在检索树的3个不同分支,你必须合并它们并使用它们,因为1,2,4的id可能在by_id 1之下,但在by_id 10之下是3,5; MySQL检索1,2,4,3,5并且不得不求助它们。
在第一种情况下,只有一个分支,每个分支已经排序