为什么当我使用ORDER BY x
命令选定的行时mysql使用filesort?
我的表看起来像这样:
CREATE TABLE `test` (
`sdf` varchar(100) NOT NULL,
`sdf33` varchar(100) NOT NULL,
KEY `sdf_2` (`sdf`),
FULLTEXT KEY `sdf33` (`sdf33`),
FULLTEXT KEY `sdf` (`sdf`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
运行时
EXPLAIN SELECT *
FROM `test`
ORDER BY sdf
mysql说它正在使用filesort
,为什么?如果不使用filesort
,我需要更改哪些内容?
答案 0 :(得分:3)
FULLTEXT
索引不会预先订购,也不能用于ORDER BY
。
但即使你在BTREE
上有sdf
索引,也很可能也不会使用它,因为在循环中查找表查找通常比按顺序扫描表更昂贵排序。
该索引可用于ORDER BY / LIMIT
:
CREATE INDEX ix_test_sdf ON test (sdf);
SELECT *
FROM test
ORDER BY
sdf
LIMIT 10
LIMIT
有一定的阈值,之后优化器会更喜欢文件分区。
您可以强制优化器使用索引:
SELECT *
FROM test FORCE INDEX (ix_test_sdf)
ORDER BY
sdf
如果你真的不想拥有一个文件夹。
答案 1 :(得分:0)
sdf
上的全文索引不能用于ORDER BY
操作(它们只能用于MATCH() ... AGAINST
查询),这就是它在表上使用文件排的原因。
除了全文索引之外,解决方案是在sdf
上添加另一个常规索引。
答案 2 :(得分:-1)
在sdf上添加索引。并再次运行查询。