2011-09-01 31 views
4

我见过很多类似的问题,但是我没有看到适用于我的解决方案。或者,也许我正在密集。 :)希望有人能帮助我。MYSQL在简单查询中使用ORDER BY索引列时使用filesort

我有如下表:

CREATE TABLE `table_name` (
    `value1` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `value2` varchar(50) NOT NULL, 
    `value3` tinytext, 
    `value4` tinytext, 
    `value5` tinytext, 
    `value6` char(3) DEFAULT NULL, 
    `value7` char(3) DEFAULT NULL, 
    PRIMARY KEY (`value1`), 
    KEY value2_index ('value2') 
) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=latin1; 

为了验证我的指标进行设置,这是SHOW INDEX结果:

+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table  | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| table_name |   0 | PRIMARY  |   1 | value1  | A   |   43 |  NULL | NULL |  | BTREE  |   | 
| table_name |   1 | value2_index |   1 | value2  | A   |  NULL |  NULL | NULL | YES | BTREE  |   | 
+--------------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
2 rows in set (0.00 sec) 

当我运行此查询:

SELECT value2, value6 
FROM table_name 
WHERE value7 = 'Yes' 
ORDER BY value2; 

我认为通过在value2上添加一个索引,它会停止使用filesort的查询。然而,EXPLAIN显示方式不同:

+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra      | 
+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+ 
| 1 | SIMPLE  | table_name | ALL | NULL   | NULL | NULL | NULL | 43 | Using where; Using filesort | 
+----+-------------+--------------+------+---------------+------+---------+------+------+-----------------------------+ 
1 row in set (0.00 sec) 

我在做什么错?

谢谢!

回答

6

查询首先需要查找值为value7 ='是'的行,这意味着您的索引必须包含value7作为第一列,才能使用。对于那些匹配的行,它需要按value2进行排序。所以这个查询需要一个多列索引(value7,value2)。

您可以在MySQL docs中查看更多关于索引的信息。

相关问题