san*_*a26 5 mysql explain filesort
我有一个简单的表 - >
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL
Run Code Online (Sandbox Code Playgroud)
我的桌面引擎是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;
Run Code Online (Sandbox Code Playgroud)
该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;
Run Code Online (Sandbox Code Playgroud)
该Extra柱说,Using where; Using filesort和键列说combo1.
为什么filesort在第二种情况下出现,即使QEP显示优化器正在使用索引combo1,其中包含'id'索引.
索引是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并且必须使用它们.
在第一种情况下,只有一个分支,并且每个分支已经排序