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

为什么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秒。如何优化这个简单的查询?


一只斗牛犬
浏览 475回答 3
3回答

慕后森

我自己也有同样的问题。考虑到您希望收集大量的此数据,而不是特定的30集,您可能会运行一个循环,并将偏移量增加30。所以你可以做的是:保存一组数据(30)的最后一个id(例如lastId=530)添加条件WHERE id > lastId limit 0,30所以你总是可以有一个零偏移。你会惊讶于性能的提高。

慕尼黑的夜晚无繁华

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(即差距)。
打开App,查看更多内容
随时随地看视频慕课网APP