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

问题描述 投票:0回答:2

我正在使用mysql来查询数据库。我想要做的是查询完整数据库,但只查询按时间戳排序的最后1000行。

我试图使用这个不符合我要求的广告。我知道限制用于返回固定数量的选定元素。但这不是我想要的。我想查询固定数量的元素。

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

有帮助吗?

mysql query-performance
2个回答
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,然后逐个扫描start_time条目,直到找到1000.无需排序;索引是预先排序的。

CREATE INDEX x_mutable_start_time ON mutable (name, start_time);

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

CREATE INDEX x_mutable_start_time ON mutable (name, start_time DESC);

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),因此数据集减少将是最快的。

© www.soinside.com 2019 - 2024. All rights reserved.