我在优化一些考虑了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] 删除。
我来说两句