2012-06-06 57 views
0

爲什麼我用ORDER BY x命令選定的行時,mysql使用filesort?MyISAM表使用帶ORDER BY的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

FULLTEXT索引不預先訂購,不能用於ORDER BY

但是,即使您在sdf上有BTREE索引,它也很可能不會被使用,因爲循環中的表查找通常比按順序掃描表並對其進行排序更昂貴。

索引將是使用對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 

,如果你真的不希望有一個文件排序。

+0

我已經有了一個普通的'索引'。它沒有幫助。它仍在使用filesort。 – Marwelln

+0

@Marwelln:是的,我的答案解釋了原因。 – Quassnoi

-1

在sdf上添加一個索引。並再次運行查詢。

0

sdf上的全文索引不能用於ORDER BY操作(它們只能用於MATCH() ... AGAINST查詢)這就是爲什麼它在表上使用文件夾的原因。

解決方法是除了全文索引之外,還要在sdf上添加另一個常規索引。

+0

只是,它沒有幫助。 – Marwelln

相關問題