我正在使用mysql来查询数据库。我想要做的是查询完整数据库,但只查询按时间戳排序的最后1000行。
我试图使用这个不符合我要求的广告。我知道限制用于返回固定数量的选定元素。但这不是我想要的。我想查询固定数量的元素。
select * from mutable where name = 'myschema' ORDER BY start_time DESC LIMIT 1000;
有帮助吗?
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_id
和start_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;
这将获取您需要的所有数据,而无需扫描和排序整个表。
如果在name
和start_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);
诀窍是排序较少的数据,如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),因此数据集减少将是最快的。