简单有序的MySQL查询在大型表上运行速度非常慢

时间:2013-02-20 12:39:24

标签: mysql select sql-order-by

我有一张约1.500.000记录的表:

CREATE TABLE `item_locale` (
  `item_id` bigint(20) NOT NULL,
  `language` int(11) NOT NULL,
  `name` varchar(256) COLLATE utf8_czech_ci NOT NULL,
  `text` text COLLATE utf8_czech_ci)
  PRIMARY KEY (`item_id`,`language`),
  KEY `name` (`name`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

item_idlanguage为主键,name上的索引为255。

使用以下查询:

select item_id, name from item_locale order by name limit 50;

虽然只需要50行,但选择大约需要3秒钟。

我该怎么做才能加快这种查询速度?

编辑:有些人建议添加一个INDEX。我在上面提到过,name列的索引大小为255。

我在命令上运行explain

+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows    | Extra          |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
|  1 | SIMPLE      | item_locale | ALL  | NULL          | NULL | NULL    | NULL | 1558653 | Using filesort |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+

奇怪的是,似乎没有使用任何索引......

4 个答案:

答案 0 :(得分:1)

检索50个记录也更重要。将它们限制为10因为您也使用了Order ..

答案 1 :(得分:1)

尝试使用查询提示:

select item_id, name 
 from item_locale USE INDEX FOR ORDER BY (name) 
  order by name limit 50;

也尝试使用

select item_id, name 
 from item_locale FORCE INDEX (name) 
  order by name limit 50;

答案 2 :(得分:1)

最后,索引存在某种问题 - 我将它们全部删除并重新创建它们。它终于奏效了。感谢。

答案 3 :(得分:0)

在名称字段上应用索引,这可能会加快它的速度。

相关问题