我有一个 movies
表。它有 130 万行。
该表在 title
列上有一个 INDEX
,顺序为 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
最佳答案
编辑:前缀索引比我使用的部分索引更好。
由于您的索引是部分索引,MySQL 可能不会将其用于 order by 并且仍然必须按值的全长对值进行排序。
让我们试试这个小样本:
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 现在正在尝试“文件排序”。
# 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 的索引。
关于mysql - 为什么我的带有 ORDER BY 的 MySQL SELECT 语句这么慢,即使列上有 INDEX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836585/