简单有序的MySQL查询运行很慢上一大桌

问题描述:

我有〜1,500,000记录的表:上name简单有序的MySQL查询运行很慢上一大桌

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作为主键和索引的大小为255

用下面的查询:

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

的选择需要3秒左右的事件,虽然只要求50行。

我能做些什么来加快这样的查询?

编辑:你们中的一些人建议添加一个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 | 
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+ 

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

+1

使用'EXPLAIN'查看MySQL如何执行您的查询。 – 2013-02-20 12:41:31

+0

一个简单的解决方案是在item_id和name上添加一个覆盖索引。根据MySQL处理组合索引的方式,单独在'name'上添加一个索引就足够了*(读作:我不知道)* – 2013-02-20 12:45:37

+0

我添加了explain命令的结果。 – 2013-02-20 13:09:45

在尽头,有某种问题与指标 - 我放弃了所有这些,再重新创建它们。它终于有效。谢谢。

检索50条记录也较重。将它们限制为10因为您也在使用Order ..

+4

将其限制为0,它甚至会更快。严重的是,检索50条记录不应该是问题。 – 2013-02-20 12:43:47

+0

有很多像索引等查询优化技术请尝试使用它们,他们将是有益的 – 2013-02-20 13:14:39

在名称字段上应用索引可能会加快一点。

+1

该指数已经在那里,因为它在文中提到。 – 2013-02-20 13:09:18

尝试使用查询提示:

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; 
+0

没有效果,仍然很慢,解释显示没有区别。 – 2013-02-20 14:23:21