数据库
首页 > 数据库> > mysql – 使用IN()子句生成Filesort

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