2013-03-11 74 views
2

我想創建一個選擇查詢,但mysql總是使用「使用filesort」額外時,我使用解釋查詢。不能避免'使用filesort'在一個非常簡單的查詢與訂單

我試着用最簡單的查詢,但問題並沒有消失。 我的表「編法」的結構是:

CREATE TABLE IF NOT EXISTS `Partidas` (
    `IdUsuario` int(11) NOT NULL, 
    `IdPartida` int(11) NOT NULL, 
    `TipoPartida` tinyint(4) NOT NULL, 
    `Facil` tinyint(1) NOT NULL DEFAULT '0', 
    `Normal` tinyint(1) NOT NULL DEFAULT '0', 
    `Dificil` tinyint(1) NOT NULL DEFAULT '0', 
    `FchPartida` date NOT NULL, 
    `PuntosPartida` mediumint(9) NOT NULL, 
    `IdPartidaTemp` bigint(20) NOT NULL, 
    `ComplPers` tinyint(1) NOT NULL, 
    `SoloMulti` tinyint(2) NOT NULL, 
    PRIMARY KEY (`IdUsuario`,`IdPartida`), 
    KEY `IX_PARTIDAS_RECORDS` (`TipoPartida`,`FchPartida`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_ORDEN2` (`FchPartida`), 
    KEY `IX_PARTIDAS_COMPLPERS` (`ComplPers`,`FchPartida`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_SOLOMULTI` (`SoloMulti`,`FchPartida`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_DIFICULTAD` (`Facil`,`Normal`,`Dificil`,`SoloMulti`,`FchPartida`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_COMPMULTI` (`ComplPers`,`SoloMulti`,`FchPartida`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_COMPLPERS_SIMPLE` (`ComplPers`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_SOLOMULTI_SIMPLE` (`SoloMulti`,`PuntosPartida`), 
    KEY `IX_PARTIDAS_FECHA` (`FchPartida`), 
    KEY `IX_PARTIDAS_PUNTOS` (`PuntosPartida`), 
    KEY `PRUEBA_PARTIDAS` (`PuntosPartida`,`TipoPartida`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

表有大約1000-5000行(還真有點數據),但總是用文件排序使用。我使用的測試查詢是:

explain select * 
from Partidas 
order by PuntosPartida 
limit 0, 50; 

,其結果是:

| id | select_type | table    | type | possible_keys | key  | key_len | ref | rows | Extra   | 
| 1 | SIMPLE  | Partidas   | ALL | NULL   | NULL  | NULL |NULL | 1041 | Using filesort | 

,但如果在查詢我更改限制,例如,限制0,5;那麼結果也會發生變化

| id | select_type | table    | type | possible_keys | key    | key_len | ref | rows | Extra  | 
| 1 | SIMPLE  | Partidas   | index | NULL   | IX_PARTIDAS_PUNTOS | 3  |NULL | 5 |    | 

在MySQL配置,緩衝區的變量和排序是:

-myisam sort buffer size: 2MB 
-sort buffer size: 2MB 
-key buffer size: 1GB 

,但我試圖改變這些值(增加,直到8MB),結果是一樣的

謝謝大家幫忙

+0

沒有「使用文件排序」中的解釋結果也read more here你能向我們展示了 – 2013-03-11 13:29:02

+0

你可以用'USE INDEX嘗試(IX_PARTIDAS_PUNTOS )'如果你確定這個查詢的索引會更快。或者嘗試運行'ANALYZE TABLE Partidas'來重新計算索引統計信息。 http://dev.mysql.com/doc/refman/5.1/en/index-hints.html – Marki555 2013-03-11 13:39:23

+0

這個具體的查詢速度非常快,但我很擔心,因爲我在其他大於此的表中存在相同的問題,並且他們很慢,我認爲問題是使用filesort和臨時使用,並且我想首先處理最簡單的查詢 – Juamba 2013-03-11 13:44:44

回答

0

我的猜測是,這是查詢優化器做的工作。 This article here顯示「優化器首選全表掃描,甚至沒有考慮將索引掃描爲相關選項(possible_keys:NULL)」

您可以強制它使用索引,但執行時間可能會更慢(如文章中提到的那樣)。

select * 
from Partidas FORCE INDEX(IX_PARTIDAS_PUNTOS) 
order by PuntosPartida 
limit 0, 50; 

您如何避免表掃描(「使用文件排序」)

相關問題