为了账号安全,请及时绑定邮箱和手机立即绑定

为什么MySQL更高的限制抵消了查询慢下来?

为什么MySQL更高的限制抵消了查询慢下来?

一只斗牛犬 2019-07-02 15:58:49
为什么MySQL更高的限制抵消了查询慢下来?简而言之:一个记录超过1600万条(2GB)的表。SELECT的限制偏移量越高,使用ORDERBY*PRIMARY_KEY*查询的速度就越慢所以SELECT * FROM large ORDER BY `id`  LIMIT 0, 30比SELECT * FROM large ORDER BY `id` LIMIT 10000, 30只订购了30条记录和同样的方式。所以这不是订单的开销。现在,当获取最新的30行时,大约需要180秒。如何优化这个简单的查询?
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

我自己也有同样的问题。考虑到您希望收集大量的此数据,而不是特定的30集,您可能会运行一个循环,并将偏移量增加30。

所以你可以做的是:

  1. 保存一组数据(30)的最后一个id(例如lastId=530)
  2. 添加条件

    WHERE id > lastId limit 0,30

所以你总是可以有一个零偏移。你会惊讶于性能的提高。


查看完整回答
反对 回复 2019-07-02
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

MySQL不能直接转到第10000条记录(或者你建议的80万字节),因为它不能假设它是那样打包/排序的(或者它有1到10000的连续值)。虽然实际上可能是这样,但MySQL不能假设没有漏洞/空白/删除ID。

因此,正如bobs所指出的,mysql将需要获取10000行(或遍历索引的第10000个条目)。id)在找到30点要返回之前。

编辑*说明我的观点

注意,尽管

SELECT * FROM large ORDER BY id LIMIT 10000, 30

会是慢(呃),

SELECT * FROM large WHERE id >  10000 ORDER BY id LIMIT 30

会是快(呃),并将返回相同的结果,前提是不缺少ids(即差距)。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信