ind*_*ago 3 mysql performance query-performance
我在 MySQL 中有一个表,它有大约 1000 万条记录,现在一个过去需要微秒的查询现在需要超过 8 秒才能执行!这是我的表结构:
CREATE TABLE `runs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`runstub` VARCHAR(20) DEFAULT NULL,
`userid` INT(11) DEFAULT NULL,
`processid` INT(11) DEFAULT NULL,
`rundata` VARCHAR(255) DEFAULT NULL,
`token` VARCHAR(60) DEFAULT NULL,
`created_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `created_at` (`created_at`)
) ENGINE=INNODB AUTO_INCREMENT=10039971 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
这是需要超过 8 秒的查询...
SELECT MIN(created_at), MAX(created_at) FROM runs ORDER BY id DESC LIMIT 10000
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这个查询,让它在不到一秒的时间内运行?
这是我想要达到的结果:从最近的 10k 条记录(不是全部),花费的时间。我想要它开始的时间 ( MIN(created_at)) 和结束的时间 ( MAX(created_at))。我怎样才能无限制地实现这一目标?
这是一种尝试:
SELECT MIN(created_at), MAX(created_at)
FROM (
SELECT created_at
FROM runs
ORDER BY id DESC
LIMIT 10000
) as x;
Run Code Online (Sandbox Code Playgroud)
您的查询被评估为:
SELECT MIN(created_at), MAX(created_at) FROM runs
Run Code Online (Sandbox Code Playgroud)
然后根据 id 排序(这没有意义)并返回最多 10000 行(仅存在 1 行)
我的查询首先选择 10000 个最近的 ID
SELECT created_at
FROM runs
ORDER BY id DESC
LIMIT 10000
Run Code Online (Sandbox Code Playgroud)
从那里它为 created_at 选择 min 和 max
| 归档时间: |
|
| 查看次数: |
1716 次 |
| 最近记录: |