mysql - 为什么我的带有 ORDER BY 的 MySQL SELECT 语句这么慢,即使列上有 INDEX?

标签 mysql indexing sql-order-by

我有一个 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/

相关文章:

MySQL - 非常慢的查询(在一张表上简单选择)

c - 如何从指针读取 64 位到 8 位值

postgresql - 如何在 PgAdmin、sql 中使用顺序和组更改行顺序?

mysql - 如果第一列是唯一的,是否会检查 ORDER BY 的第二列?

MySQL GROUP BY 排序时没有 ORDER BY

mysql - 数据库中的保存时间 : STRING vs TIMESTAMP

mysql - 无法创建没有外键的表 errno :150 MYSQL

mysql - 使用索引语义确定 MySql 索引列中的字段是否为数字

mysql - SQL 'IN' 和 'NOT IN' 在一起

php - 用户名不显示 PHP/MySQL