MySQL-仅在索引字段中添加ORDER BY会为5条记录增加5分钟。从哪里开始?

问题描述 投票:1回答:1

我们有一个运行良好多年的数据库。但是,现在,我们有一个我不了解的问题。这是mysql / InnoDB配置问题吗?而且我们目前没有人进行系统维护(我是程序员)。

表格TitelDaggegevens的大小只有几Gig,大约有1200万条记录,所以没什么特别的。

如果我们这样做:

SELECT * 
  FROM TitelDaggegevens 
 WHERE fondskosten IS NULL 
   AND (datum BETWEEN 20200401 AND 20200430)

它运行良好,在十分之几秒内。

结果:52条记录。

此外,如果我们添加ORDER BY datum或通过其他任何非索引字段进行排序:一切正常,速度相同。

但是,如果我添加ORDER BY id(id是主键),则对于相同的52条记录,查询突然需要15秒。

并且当我ORDER BY另一个索引字段时,查询时间增加到4-6分钟。用于订购52条记录。在索引字段上。

我有无提示发生了什么。 EXPLAIN对我没有帮助,它对所有查询返回相同的结果。我优化/重新创建了表,检查了表,然后重新启动了服务器。一切都无济于事。我绝对不是配置MySQL或InnoDB的专家,所以我不知道从哪里开始搜索。

我只是希望也许有人认识到这一点,并可以指出正确的方向。

SHOW TABLE STATUS WHERE Name = 'TitelDaggegevens'给我:

SHOW TABLE STATUS WHERE Name = 'TitelDaggegevens'

我知道这是一个非常模糊的问题,但是我无法更具体地加以确定。我为慢速查询启用了日志记录,但表slow_log保持为空。我迷路了。

感谢您提出建议,希望在哪里寻找。

这可能对了解它的人有所帮助,但对我来说不是真正的phpmyadmins'Advisor':

Advisor

mysql phpmyadmin innodb
1个回答
0
投票

看起来像ORDER BY使用3种不同的优化计划

  1. [ORDER BY id-MySQL使用PK解析ORDER BY
  2. ORDER BY datum或其他非索引字段-MySQL使用文件排序来解析ORDER BY
  3. ORDER BY index_field-MySQL使用全索引扫描来解决ORDER BY,它比内存中的文件排序要慢得多

这是我的建议。只有EXPLAIN可以告诉正在发生的事情

Influencing ORDER BY Optimization

© www.soinside.com 2019 - 2024. All rights reserved.