0

为什么当我用 排序我选择的行时 mysql 使用文件排序ORDER BY x

我的桌子看起来像这样:

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

4

3 回答 3

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

如果你真的不想有一个文件排序。

于 2012-06-06T12:58:55.643 回答
0

您的全文索引sdf不能用于ORDER BY操作(它们只能用于MATCH() ... AGAINST查询),这就是它在表上使用文件排序的原因。

sdf解决方案是在全文索引之外添加另一个常规索引。

于 2012-06-06T12:53:53.747 回答
-1

在 sdf 上添加索引。并再次运行查询。

于 2012-06-06T12:53:45.083 回答