当我使用ORDER BY x对所选行进行排序时,为什么mysql要使用文件排序?
我的表格看起来像这样:
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 sdfmysql说它使用的是filesort,为什么?我需要做什么更改才能不使用filesort
发布于 2012-06-06 20:58:56
FULLTEXT索引不表示排序,因此不能用于ORDER BY。
但是,即使您在sdf上有一个BTREE索引,也很可能不会使用它,因为在循环中查找表通常比按顺序扫描表并对其进行排序的开销更大。
该索引将用于ORDER BY / LIMIT
CREATE INDEX ix_test_sdf ON test (sdf);
SELECT *
FROM test
ORDER BY
sdf
LIMIT 10LIMIT有一个特定的阈值,超过这个阈值优化器会更喜欢文件排序。
您可以强制优化器使用索引:
SELECT *
FROM test FORCE INDEX (ix_test_sdf)
ORDER BY
sdf如果你真的不想有一个文件排序。
发布于 2012-06-06 20:53:54
sdf上的全文索引不能用于ORDER BY操作(它们只能用于MATCH() ... AGAINST查询),这就是它在表上使用文件排序的原因。
解决方案是除了全文索引之外,在sdf上添加另一个常规索引。
发布于 2012-06-06 20:53:45
在sdf上添加索引。然后再次运行查询。
https://stackoverflow.com/questions/10914510
复制相似问题