如何在mysql中按日期查询固定数量的行?

时间:2019-03-28 15:44:39

标签: mysql query-performance

我正在使用mysql查询数据库。我想做的不是查询整个数据库,而是查询按时间戳排序的最后1000行。

我尝试使用此查询,该查询对我想要的广告无效。我知道该限制用于返回固定数量的所选元素。但这不是我想要的。我想查询固定数量的元素。

select * from mutable where name = 'myschema' ORDER BY start_time DESC LIMIT 1000;

有帮助吗?

2 个答案:

答案 0 :(得分:0)

tl; dr较少数据排序

我猜您的mutable表具有一个称为mutable.mutable_id的自动递增主键。

然后您可以执行以下操作:

                 SELECT mutable_id 
                   FROM mutable 
                  WHERE name = 'myschema' 
                  ORDER BY start_time DESC 
                  LIMIT 1000;

它为您提供了所有相关行的ID的结果集。这样ORDER BY ... LIMIT的工作只需排序mutable_idstart_time值,而不是整个表。因此,它在MySql服务器中占用的空间和时间更少。

然后使用该查询检索详细信息:

 SELECT *
   FROM mutable
  WHERE mutable_id IN (
                 SELECT mutable_id
                   FROM mutable 
                  WHERE name = 'myschema' 
                  ORDER BY start_time DESC 
                  LIMIT 1000
        )
  ORDER BY start_time DESC;

这将获取您需要的所有数据,而无需扫描整个表并对其进行排序。

如果您在namestart_time上创建索引,则子查询将更快:查询可以将索引随机访问到适当的name,然后扫描{{1} }一个接一个地输入,直到找到1000。索引已预先排序。

start_time

如果您使用的是MySQL 8,则可以创建一个降序索引,它甚至更快。

CREATE INDEX x_mutable_start_time ON mutable (name, start_time);

答案 1 :(得分:0)

这仅适用于auto_increment

技巧是像O. Jones所提到的那样对数据进行排序。问题在于告诉MySQL该怎么做。

MySQL不能知道什么是“最后1000条记录”,除非它根据查询对它们进行排序。正是您要避免这种情况,因此您需要告诉MySQL如何查找“最后1000条记录”。

该技巧包括告诉MySQL从哪个auto_increment开始查找数据。问题是您使用的是时间戳记,所以我不确定这是否适合您的特定用例。

以下是查询:

SELECT * FROM mutable 
WHERE `name` = 'myschema' 
AND id > (SELECT MAX(id) - 1000 FROM mutable WHERE `name` = 'myschema') 
ORDER BY start_time DESC LIMIT 1000;

问题:

  • auto_increments有空白。这些数字不是顺序的,而是唯一的,通过顺序增量算法计算得出。为了获得更好的结果,请增加减法次数。您可能会获得1000个结果,但可能会得到500个结果-取决于您的数据集

  • 如果您没有auto_increment,那就没用了

  • 如果要求事先插入的时间戳从大到小进行排序,这是没有用的

优点: -主键用于定义值范围(其中id> x),因此数据集缩减将是最快的。