对日期时间列的慢速选择查询

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))。我怎样才能无限制地实现这一目标?

Len*_*art 9

这是一种尝试:

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