0

我有一张有 ~ 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 行,但 select 需要大约 3 秒的时间。

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

编辑:你们中的一些人建议添加一个索引。我在上面提到过,该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

4 回答 4

1

Try to use query hint:

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

also try to use

select item_id, name 
 from item_locale FORCE INDEX (name) 
  order by name limit 50;
于 2013-02-20T13:54:25.867 回答
1

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

于 2013-02-20T12:42:07.783 回答
1

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

于 2013-02-27T05:08:40.237 回答
0

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

于 2013-02-20T12:45:26.933 回答