作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个简单的表格->
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
列显示 Using 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
列表示 Using where;使用 filesort
和键列表示 combo1
。
为什么在第二种情况下会出现 filesort
,即使 QEP 显示优化器正在使用其中包含“id”索引的索引 combo1。
最佳答案
索引是一个B+树。这意味着在 by_id 1 下有所有 posted_on 为 0 和 by_id 为 1 的记录,然后您拥有这些记录的所有 ID。然而,在 by_id 7 下,您有另一个 Twig ,其中包含 posted_on 0 的记录,并且它们包含带有 ID 的记录。
当你有 in 子句时,你正在检索树的 3 个不同分支,你必须合并它们并求助它们,因为具有 1,2,4 的 ID 可能在 by_id 1 下,但 3,5 在 by_id 10 下; MySQL 检索 1,2,4,3,5 并且必须求助于它们。
第一种情况只有一个分支,并且每个分支都已经排序
关于mysql - 使用 IN() 子句导致 Filesort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14996640/
我是一名优秀的程序员,十分优秀!