我在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;
这是一个超过8秒的查询…
SELECT MIN(created_at), MAX(created_at) FROM runs ORDER BY id DESC LIMIT 10000
有没有办法可以优化此查询以使其在不到一秒的时间内运行?
这是我想要实现的结果:从最后的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;
您的查询评估为:
SELECT MIN(created_at), MAX(created_at) FROM runs
然后根据id(没有意义)对它进行排序,最多返回10000行(仅存在1行)
我的查询首先选择10000个最近的id
SELECT created_at
FROM runs
ORDER BY id DESC
LIMIT 10000
从那里它为created_at选择min和max
标签:query-performance,mysql
来源: https://codeday.me/bug/20190806/1596040.html