2013-03-11 35 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; 

您如何避免表扫描(“使用文件排序”)

相关问题