2011-06-17 63 views
3

我查看了多個類似的帖子,試圖獲得關於如何重新定義我的索引的輸入,但無法弄清楚這一點。每次我包含ORDER BY語句時,它都會使用filesort返回結果集。mysql單表SELECT查詢ORDER BY導致FILESORT

這裏的表定義和查詢:

SELECT 
    `s`.`title`, 
    `s`.`price`, 
    `s`.`price_sale` 
    FROM `style` `s` 
WHERE `s`.`isactive`=1 AND `s`.`department`='women' 
    ORDER 
    BY `s`.`ctime` DESC 



CREATE TABLE IF NOT EXISTS `style` (
    `id` mediumint(6) unsigned NOT NULL auto_increment, 
    `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `department` char(5) NOT NULL, 
    `isactive` tinyint(1) unsigned NOT NULL, 
    `price` float(8,2) unsigned NOT NULL, 
    `price_sale` float(8,2) unsigned NOT NULL, 
    `title` varchar(200) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `idx_grid_default` (`isactive`,`department`,`ctime`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=47 ; 

而且,這裏的解釋結果集,我得到:

+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra      | 
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
| 1 | SIMPLE  | s  | ref | idx_grid  | idx_grid | 6  | const,const | 3 | Using where; Using filesort | 
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
+0

我測試了你的設置,這個索引似乎用得很好,你爲什麼認爲正在使用一個文件夾? EXPLAIN SELECT's'.'title',... [...] possible_keys:idx_grid_default 鍵:idx_grid_default 額外:使用哪裏 – Gryphius

+0

這很奇怪 - 我得到一個「使用這裏;使用的filesort」 - 看我上面的 – snucky

+1

嗯解釋,所以,如果你得到了什麼'使用filesort'?什麼讓你感到困擾?你認爲這是錯的還是?你知道這意味着什麼嗎? –

回答

3

爲什麼s.isactive不習慣爲指標?

如果基數較低,MySQL(或任何SQL)就不會使用密鑰。 用簡單的英語,如果很多行共享一個鍵的相同值,(My)SQL將不會使用索引,而只是真正的表。

布爾型字段幾乎從未被選爲索引,因爲這樣;太多的行共享相同的值。

爲什麼MySQL不使用ctime的索引?

ctime包含在多字段或composite索引中。 如果你使用它的所有或它的最左邊的部分*)
如果排序在綜合指數的中間或最右邊的欄位,MySQL不能使用MySQL將只使用一個綜合指數索引,並將不得不訴諸文件。
因此,order by isactive , department將使用索引;
order by department不會。
order by isactive也不是使用索引,但這是因爲布爾字段isactive的基數太低。 *

*)有一些例外,但是這涵蓋了97%的情況。

鏈接:
基數維基百科:http://en.wikipedia.org/wiki/Cardinality_%28data_modeling%29
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

1

What does Using filesort mean in MySQL?

這並不意味着你有一個臨時文件,它只是意味着一種完成(壞名,忽略4第一個字母)。

巴倫·施瓦茨

事實是,文件排序是嚴重命名。任何時候都不能從索引執行排序,它是一個文件夾。它與文件無關。 Filesort應該被稱爲「排序」。它的核心是快速排序。