5

我有一张简单的桌子->

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;

ExtraUsing where和关键列说combo1

但是,当我运行这个查询时->

EXPLAIN SELECT * FROM books 
        WHERE by_id IN(1,7,10) AND posted_on = '0' 
        ORDER BY id DESC LIMIT 7;

ExtraUsing where; Using filesort和关键列说combo1

为什么filesort即使 QEP 显示优化器正在使用索引组合 1,它在其中索引了“id”,也会在第二种情况下发生。

4

1 回答 1

6

索引是 B+ 树。这意味着在 by_id 1 下有所有的记录都以 posted_on 0 和 by_id 1,然后你就有了这些记录的所有 id。但是,在 by_id 7 下,您还有另一个树枝,其中包含带有 posted_on 0 的记录,并且它们包含带有其 id 的记录。

当您有 in 子句时,您正在检索树的 3 个不同分支,您必须合并它们并重新使用它们,因为 1,2,4 的 id 可能在 by_id 1 下,但 3,5 在 by_id 10 下;MySQL 检索 1,2,4,3,5 并且必须使用它们。

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

于 2013-02-21T07:36:10.493 回答