简单有序的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_id
,language
作为主键和索引的大小为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 |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
奇怪的是,它似乎没有使用任何索引...
在尽头,有某种问题与指标 - 我放弃了所有这些,再重新创建它们。它终于有效。谢谢。
检索50条记录也较重。将它们限制为10因为您也在使用Order ..
将其限制为0,它甚至会更快
有很多像索引等查询优化技术请尝试使用它们,他们将是有益的 – 2013-02-20 13:14:39
在名称字段上应用索引可能会加快一点。
该指数已经在那里,因为它在文中提到。 – 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;
没有效果,仍然很慢,解释显示没有区别。 – 2013-02-20 14:23:21
使用'EXPLAIN'查看MySQL如何执行您的查询。 – 2013-02-20 12:41:31
一个简单的解决方案是在item_id和name上添加一个覆盖索引。根据MySQL处理组合索引的方式,单独在'name'上添加一个索引就足够了*(读作:我不知道)* – 2013-02-20 12:45:37
我添加了explain命令的结果。 – 2013-02-20 13:09:45