有人能解释一下,如果我想获取最后10条记录,在mysql查询中添加“limit”会让它更快吗?喜欢
SELECT * FROM `table` ORDER BY id DESC LIMIT 50;
有没有其他方法来获取最后10条记录,还是更快?
svmlkihl1#
增加限制会使它更快。没错。在这种情况下,将选择插入数据库的最后10条记录
lg40wkob2#
可以使用派生表代替限制 IN 或者 subquery 然后是一个动态的 rownum 变量。但这可能是非常复杂和缓慢的选择。因此,我建议您使用相同的查询从表中获取最后一行,而不是使用任何其他替代方法。因为如果您想使用子查询,那么您必须跟踪max id数据,并且可能一些数据被删除或删除,那么它将无法返回适当数量的记录。你也可以用 col name 而不是 * 以获得更多优化。
IN
subquery
rownum
col name
*
x8goxv8g3#
问题在于 limit 它必须在只返回最后50行之前对表中的所有行进行排序,因此它总是很慢,并且会随着表的增长而变慢(不可伸缩)。获得最后50名的最快方法是:
limit
SELECT * FROM `table` WHERE id > (SELECT MAX(id) FROM `table`) - 50
这将使用上的索引 id 获得最大id,再次获得前50名。您还应该尝试更复杂但可能更好优化的方法:
id
SELECT * FROM `table` WHERE id BETWEEN (SELECT MAX(id) FROM `table`) - 49 AND (SELECT MAX(id) FROM `table`)
比较实际运行时间,找出最快的运行时间。
3条答案
按热度按时间svmlkihl1#
增加限制会使它更快。没错。在这种情况下,将选择插入数据库的最后10条记录
lg40wkob2#
可以使用派生表代替限制
IN
或者subquery
然后是一个动态的rownum
变量。但这可能是非常复杂和缓慢的选择。因此,我建议您使用相同的查询从表中获取最后一行,而不是使用任何其他替代方法。因为如果您想使用子查询,那么您必须跟踪max id数据,并且可能一些数据被删除或删除,那么它将无法返回适当数量的记录。你也可以用
col name
而不是*
以获得更多优化。x8goxv8g3#
问题在于
limit
它必须在只返回最后50行之前对表中的所有行进行排序,因此它总是很慢,并且会随着表的增长而变慢(不可伸缩)。获得最后50名的最快方法是:
这将使用上的索引
id
获得最大id,再次获得前50名。您还应该尝试更复杂但可能更好优化的方法:
比较实际运行时间,找出最快的运行时间。