【发布时间】:2026-02-14 04:55:02
【问题描述】:
我的应用程序使用 MariaDB 数据库,我试图保持隔离,但一位特定用户直接访问该数据库并在 6 周后今天开始抱怨他们的一个查询从 5 分钟变慢(我认为这很糟糕)足够)超过120分钟。
从今天开始,它有时像往常一样快,有时又放慢了速度。
这是他们的查询:
SELECT MAX(last_updated) FROM data_points;
这是桌子:
CREATE TABLE data_points (
seriesId INT UNSIGNED NOT NULL,
modifiedDate DATE NOT NULL,
valueDate DATE NOT NULL,
value DOUBLE NOT NULL,
created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_updated DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP()
ON UPDATE CURRENT_TIMESTAMP,
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
CONSTRAINT pk_data PRIMARY KEY (seriesId, modifiedDate, valueDate),
KEY ix_data_modifieddate (modifiedDate),
KEY ix_data_id (id),
CONSTRAINT fk_data_seriesid FOREIGN KEY (seriesId)
REFERENCES series(id)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
MAX_ROWS=222111000;
这是解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE data_points ALL NULL NULL NULL NULL 224166191
该表大约有 2.5 亿行,并且增长相对较快。
我可以强迫用户做一些更明智的事情,但在短期内,我很想知道为什么在 6 周的平静之后,查询持续时间今天变得疯狂。我会接受第一个可以解释的答案。
【问题讨论】:
-
“我会接受第一个可以解释的答案。” last_updated 列未编入索引
-
显而易见的答案是它正在执行表扫描,因为
last_updated列上没有索引。我没有解释(我怀疑你会找到一个)为什么一周需要 5 分钟,然后下周需要 120 分钟。之前的速度可能是因为用户频繁执行查询并且结果被索引,或者新的缓慢可能是由于行数突然增加,或者新的行数提示查询优化器使用不同的查询计划效率较低......或其他一些事情。不过很难说。 -
只需索引该列并完成它.. 现代 MySQL 版本和 InnoDB 引擎版本现在可以通过在线 DDL 执行此操作而无需停机确保检查正确的文档链接..