我正在使用mysql查询数据库。我想做的不是查询整个数据库,而是查询按时间戳排序的最后1000行。
我尝试使用此查询,该查询对我想要的广告无效。我知道该限制用于返回固定数量的所选元素。但这不是我想要的。我想查询固定数量的元素。
select * from mutable where name = 'myschema' ORDER BY start_time DESC LIMIT 1000;
有帮助吗?
答案 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_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
,然后扫描{{1} }一个接一个地输入,直到找到1000。索引已预先排序。
start_time
如果您使用的是MySQL 8,则可以创建一个降序索引,它甚至更快。
CREATE INDEX x_mutable_start_time ON mutable (name, start_time);
答案 1 :(得分:0)
技巧是像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),因此数据集缩减将是最快的。