MyISAM表使用带有ORDER BY的filesort,为什么?

时间:2012-06-06 12:46:43

标签: mysql myisam

为什么当我使用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,我需要更改哪些内容?

3 个答案:

答案 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上添加索引。并再次运行查询。