【发布时间】:2020-05-05 17:56:15
【问题描述】:
编辑 2:现在我们已经优化了数据库并缩小了 MySQL - Why is phpMyAdmin extremely slow with this query that is super fast in php/mysqli?
编辑 1:有两种解决方案对我们有帮助。一个在数据库级别(配置),一个在查询级别。我当然只能接受一个作为最佳答案,但如果您有类似的问题,请同时查看。
我们的数据库多年来一直运行良好。但是,现在,我们有一个我不明白的问题。是 mysql/InnoDB 配置问题吗?而且我们目前没有人进行系统维护(我是程序员)。
TitelDaggegevens 表只有几 Gigs 大小,大约有 12,000,000 条记录,所以没什么特别的。
如果我们这样做:
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 条记录。在索引字段上。
我不知道发生了什么。解释对我没有帮助。我优化/重新创建了表,检查了它,然后重新启动了服务器。一切都无济于事。我绝对不是配置 MySQL 或 InnoDB 的专家,所以我不知道从哪里开始搜索。
我只是希望也许有人能认识到这一点并可以为我指明正确的方向。
SHOW TABLE STATUS WHERE Name = 'TitelDaggegevens'
给我:
我知道这是一个非常模糊的问题,但我无法更具体地确定它。我为慢查询启用了日志记录,但表 slow_log 保持为空。我迷路了。
感谢您提供在哪里寻找的任何想法。
这可能对了解它的人有所帮助,但对我来说不是真的,phpmyadmins'顾问':
在 cmets 中,要求 EXPLAIN 输出做出反应:
1) 没有ORDER BY 和ORDER BY datum(在 WHERE 中并且有索引):
2) 使用ORDER BY 加上除datum 以外的任何字段(是否已编入索引,因此对于快速和慢速查询都一样)。
表结构:
CREATE TABLE `TitelDaggegevens` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`isbn` decimal(13,0) NOT NULL,
`datum` date NOT NULL,
`volgendeDatum` date DEFAULT NULL,
`prijs` decimal(8,2) DEFAULT NULL,
`prijsExclLaag` decimal(8,2) DEFAULT NULL,
`prijsExclHoog` decimal(8,2) DEFAULT NULL,
`stadiumDienstverlening` char(2) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`stadiumLevenscyclus` char(1) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`gewicht` double(7,3) DEFAULT NULL,
`volume` double(7,3) DEFAULT NULL,
`24uurs` tinyint(1) DEFAULT NULL,
`UitgeverCode` varchar(4) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`imprintId` int(11) DEFAULT NULL,
`distributievormId` tinyint(4) DEFAULT NULL,
`boeksoort` char(1) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`publishingStatus` tinyint(4) DEFAULT NULL,
`productAvailability` tinyint(4) DEFAULT NULL,
`voorraadAlles` mediumint(8) unsigned DEFAULT NULL,
`voorraadBeschikbaar` mediumint(8) unsigned DEFAULT NULL,
`voorraadGeblokkeerdEigenaar` smallint(5) unsigned DEFAULT NULL,
`voorraadGeblokkeerdCB` smallint(5) unsigned DEFAULT NULL,
`voorraadGereserveerd` smallint(5) unsigned DEFAULT NULL,
`fondskosten` enum('depot leverbaar','depot onleverbaar','POD','BOV','eBoek','geen') COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ISBN+datum` (`isbn`,`datum`) USING BTREE,
KEY `UitgeverCode` (`UitgeverCode`),
KEY `Imprint` (`imprintId`),
KEY `VolgendeDatum` (`volgendeDatum`),
KEY `Index op voorraad om maxima snel te vinden` (`isbn`,`voorraadAlles`) USING BTREE,
KEY `fondskosten` (`fondskosten`),
KEY `Datum+isbn+fondskosten` (`datum`,`isbn`,`fondskosten`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16519430 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
【问题讨论】:
-
请提供 EXPLAIN 输出
-
你说得对,反正我应该有。所以我就这么做了。我希望它有所帮助。
-
考虑学习如何使用此 URL 中的覆盖索引 - blog.toadworld.com/2017/04/06/…
-
请发布 EXPLAIN 查询的 TEXT 结果、整个慢查询和 SHOW CREATE TABLE (for-each-table);进行分析。查看配置文件、网络配置文件以获取联系信息和免费下载的实用程序脚本以帮助进行性能调整。请发布我们的 findfragtables.sql 的第一两页输出以供分析。 MySQL 的版本?
-
"ORDER BY 另一个索引字段,查询时间增加了 4-6 分钟" -- 这仍然是 52 行输出?让我们看看那个查询和
SHOW CREATE TABLE。
标签: mysql phpmyadmin innodb