使用IN()子句生成Filesort

时间:2013-02-21 07:21:17

标签: mysql explain filesort

我有一个简单的表格 - >

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'索引。

1 个答案:

答案 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并且不得不求助它们。

在第一种情况下,只有一个分支,每个分支已经排序