如果使用 ORDER BY 字符串列,MySQL 查询需要很长时间才能执行

标签 mysql sql-order-by query-optimization

因此,如果我不使用 order by,我对包含 400 万 记录的表的查询会立即执行。不过,我想为我的客户提供一种按 Name 字段对结果进行排序的方法,并且仅显示过滤结果的最后 100 。一旦我添加order by Name,执行就需要 100 秒。

我的表结构与此类似:

CREATE TABLE Test(
   ID INT PRIMARY KEY AUTO_INCREMENT,
   Name VARCHAR(100),
   StatusID INT,
   KEY (StatusID), <-- Index on StatusID
   KEY (StatusID, Name) <-- Index on StatusID, Name
   KEY(Name) <-- Index on Name
);

我的查询只是执行以下操作:

explain SELECT ID, StatusID, Name
FROM Test
WHERE StatusID = 113
ORDER BY Name DESC
LIMIT 0, 100

上面解释了当我按Name订购时给出的结果:

enter image description here

StatusID_2StatausID, Name 的复合索引

现在,如果我将 ORDER BY Name DESC 更改为 ORDER BY ID 我会得到: enter image description here

如何才能使其在使用 ORDER BY Name 时仅检查 100 行?

最佳答案

您可以尝试一件事,尝试查找结果中预期位于 100 行的字母

SELECT *
FROM Test
*** Some Joins to filter data or get more columns from other tables
WHERE StatusID = 12 AND NAME REGEXP '^[A-H]'
ORDER BY Name DESC
LIMIT 0, 100

此外,使用索引对于名称(已应用)非常重要 - 在这种情况下,一旦生成所需的行数,就会启动索引范围扫描并停止查询执行。

所以我们不能无用地使用ID,因为当它达到极限时它不会扫描,我们唯一可以尝试的就是删除在预期结果中不可能的字母,这就是我们正在尝试做的使用正则表达式

关于如果使用 ORDER BY 字符串列,MySQL 查询需要很长时间才能执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288213/

相关文章:

sql-server - 索引插入期间的多个表假脱机(Eager 假脱机)

join - 优化多表连接的配置单元查询

mysql - 如何使用多个连接进行插入?

sql - 为什么 select 语句会影响 MySQL 中的查询执行和性能?

php - 将两套MySQL多维数组的PHP mysql_fetch_assoc集合并为一个一维数组

php - 我想将两列合并为一个新列,但前提是其中一列不为空,然后按该新列排序。 (MySQL)

php - 查询分组依据和排序依据

MySQL - 没有聚合函数的 GROUP BY 的替代方案?

oracle - 为什么即使禁用并行 DML 和并行 DDL 也会创建并行 session

mysql - 如何统计mysql的推荐量