如何使用一个 where 条件优化 MySQL 查询 MAX 主键值
How to optimize MySQL query for MAX primary key value with one where condition
我有一个 mySQL table 大约有 3000 万行,有一个 int(10) 主键 id
索引(自动递增)和其他一些 id 列,例如。 modem_id
。 modem_id 列有一个基数约为 300 的 BTREE 索引。
我正在做一个非常简单的查询,例如。
SELECT MAX(`id`) FROM `messages` WHERE `modem_id`=1234
我认为这应该执行得非常快,但它始终需要 1-2 秒。在 phpMyAdmin 中分析查询告诉我时间都处于“发送数据”状态,这没有意义,因为返回的唯一数据是一个整数值。
如何加快速度?
ADD INDEX(modem_id, id)
一般来说,查询
SELECT MAX(x) FROM t WHERE y = 1234
需要 INDEX(y, x)
-- 按此顺序。
如果您有 INDEX(y)
并且 table 是 ENGINE=InnoDB
并且 x
是 PRIMARY KEY
,那么 INDEX(y, x)
与INDEX(y)
。你的两个 SELECTs
可能会在同一时间 运行 并且具有相同的 EXPLAINs
.
没有看到 SHOW CREATE TABLE
,我不知道你是否还有其他问题 -- 当做 y = 1234
和 y
是 VARCHAR
时,测试不能使用指数。将 y
更改为 INT
或引用常量:y = "1234"
.
您获得 100+ 的加速可能是由于缓存。 运行 都查询了两次。为了进一步分析,请提供两个查询的 SHOW CREATE TABLE
和 EXPLAIN FORMAT=JSON SELECT ...
。
我有一个 mySQL table 大约有 3000 万行,有一个 int(10) 主键 id
索引(自动递增)和其他一些 id 列,例如。 modem_id
。 modem_id 列有一个基数约为 300 的 BTREE 索引。
我正在做一个非常简单的查询,例如。
SELECT MAX(`id`) FROM `messages` WHERE `modem_id`=1234
我认为这应该执行得非常快,但它始终需要 1-2 秒。在 phpMyAdmin 中分析查询告诉我时间都处于“发送数据”状态,这没有意义,因为返回的唯一数据是一个整数值。
如何加快速度?
ADD INDEX(modem_id, id)
一般来说,查询
SELECT MAX(x) FROM t WHERE y = 1234
需要 INDEX(y, x)
-- 按此顺序。
如果您有 INDEX(y)
并且 table 是 ENGINE=InnoDB
并且 x
是 PRIMARY KEY
,那么 INDEX(y, x)
与INDEX(y)
。你的两个 SELECTs
可能会在同一时间 运行 并且具有相同的 EXPLAINs
.
没有看到 SHOW CREATE TABLE
,我不知道你是否还有其他问题 -- 当做 y = 1234
和 y
是 VARCHAR
时,测试不能使用指数。将 y
更改为 INT
或引用常量:y = "1234"
.
您获得 100+ 的加速可能是由于缓存。 运行 都查询了两次。为了进一步分析,请提供两个查询的 SHOW CREATE TABLE
和 EXPLAIN FORMAT=JSON SELECT ...
。