SQL查询优化

Maritza Guerreiro

我在优化一些考虑了datetime字段的sql查询时遇到了麻烦。

首先,我的表结构如下:

  CREATE TABLE info (
  id int NOT NULL auto_increment,
  name varchar(20),
  infoId int,
  shortInfoId int,
  text varchar(255),
  token varchar(60),
  created_at DATETIME,
  PRIMARY KEY(id)
  KEY(created_at));

在一些简单查询上使用了explain之后,我添加了created_at键,从而提高了我的大多数简单查询性能。我现在遇到以下查询问题:

SELECT min(created_at), max(created_at) from info order by id DESC limit 10000

通过此查询,我希望获得最近10k个结果之间的时间间隔。

使用说明后,我得到以下结果:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE          info    ALL     NULL            NULL    NULL        NULL     4       NULL

关于如何改善此查询的性能的任何想法吗?

缺氧

如果要检查排序的前10k行,id则需要使用子查询来实现目标:

SELECT MIN(created_at), MAX(created_at)
FROM (
    SELECT created_at
    FROM info
    ORDER BY id DESC
    LIMIT 10000
) tenK

内部查询从表中获取前10k行,排序方式为id(仅created_at需要该字段)。外部表created_at从内部查询生成的结果集中计算的最小值和最大值

我没有对此进行任何EXPLAIN处理,但我认为它在“额外”列中显示“使用临时”(虽然不好,但是您不能对此请求做得更好)。但是,10,000行不是很多。它运行速度很快,并且性能不会随着表大小的增加而降低。

更新:

现在我在问题中注意到了这句话:

通过此查询,我希望获得最近10k个结果之间的时间间隔。

如果要获取created_at最近的行和过去的10k行的值,则可以使用两个简单的查询,这些查询使用索引created_at并快速运行:

(
    SELECT created_at
    FROM info
    ORDER BY id DESC
    LIMIT 1
)
UNION ALL
(
    SELECT created_at
    FROM info
    ORDER BY id DESC
    LIMIT 9999,1
)
ORDER BY created_at

该查询产生2行,第一created_at行是过去第10000行的值,第二created_at最近一行的值(我想created_at总是会增长)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章