我有一张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
答案 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
之类的内容,您最好使用FULLTEXT
和MATCH(...) AGAINST(...)
。