为什么我的带有ORDER BY的MySQL SELECT语句如此缓慢,即使列上有INDEX?

时间:2015-06-15 02:24:05

标签: mysql indexing sql-order-by

我有一张movies表。它有130万行。

该表在INDEX列上有一个title,订单asc,长度为255

title列本身是VARCHAR(1000)

即使使用该设置,以下查询也需要8秒才能运行。任何想法或镜头在黑暗中为什么这可能是?我很难过,因为这似乎是一个需要解决的基本问题。

SELECT title
FROM movies 
ORDER BY title
LIMIT 150000, 50000

当我取出ORDER BY时,查询超快(0.05秒):

SELECT title
FROM movies 
LIMIT 150000, 50000

3 个答案:

答案 0 :(得分:2)

编辑:前缀索引是比我使用的部分索引更好的名称。

由于您的索引是部分索引,因此MySQL可能不会将其用于订单,并且仍然必须按其全长对值进行排序。

让我们尝试这个小样本:

 create table o1 (a varchar(10));

 insert into o1 values('test1'),('test2'),('test3'),('tes1');
 create index oindex on o1 (a);
 explain select a from o1 order by a;

MySQL正在使用索引作为订单。

     # id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
     '1', 'SIMPLE', 'o1', 'index', NULL, 'oindex', '103', NULL, '8', 'Using index'

现在,重新创建部分索引:

 drop index oindex on o1;
 create index oindex on o1 (a (2) );
 explain select a from o1 order by a;

MySQL正在尝试" filesort"。

 # id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
 '1', 'SIMPLE', 'o1', 'ALL', NULL, NULL, NULL, NULL, '8', 'Using filesort'

对于搜索,部分索引很有用,因为MySQL可以删除这些值 不完全匹配。对于ORDER BY,MySQL可能没有这样的运气。在上面的例子中,即使我创建一个"部分索引"为了最大列的长度,MySQL仍未使用ORDER BY的索引。

答案 1 :(得分:0)

性能问题是limit子句中表示的偏移值。如果您正在阅读表格,那么您可以存储这些值并在>之前使用order by

select title
from movies
where title > $title
order by title
limit 50000;

如果$title是第150行的标题,那么这应该很快。根据此查询的结果,您可以重置$title以进行下一次查询。

我很惊讶相对较少的行需要几十秒。一旦索引在内存中,它应该更快。另一个复杂因素是title可能很长 - 因此索引可能占用数十或数百兆字节。那仍然不是 大,但它会引入明显的延迟。

答案 2 :(得分:0)

要搜索title之类的内容,您最好使用FULLTEXTMATCH(...) AGAINST(...)