mysql – 使用IN()子句生成Filesort
作者:互联网
我有一个简单的表 – >
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL
我的表引擎是MyISAM.
我在by_id,posted_on,id上有一个名为combo1的多列索引
我运行此查询 – >
EXPLAIN SELECT * FROM books
WHERE by_id = '1' AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Extra列表示使用where和key列表示combo1
但是,当我运行此查询时 – >
EXPLAIN SELECT * FROM books
WHERE by_id IN(1,7,10) AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Extra列说使用where;使用filesort和key列说combo1.
为什么在第二种情况下出现文件排序,即使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并且必须使用它们.
在第一种情况下,只有一个分支,并且每个分支已经排序
标签:mysql,filesort,explain 来源: https://codeday.me/bug/20190517/1123076.html