我有一张约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_id
,language
为主键,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 |
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+
奇怪的是,似乎没有使用任何索引......
答案 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)
在名称字段上应用索引,这可能会加快它的速度。