新睿云

> 云数据库MySQL > mysql分页慢如龟速?并不是性能不行而是您使用“姿势”错误!

mysql分页慢如龟速?并不是性能不行而是您使用“姿势”错误!

作者/来源:新睿云小编 发布时间:2019-11-14

limit与OFFSET在mysql中可以算是分页神器了,很多分页都是基于这么偏移量实现的。大多数时候是够了,但如果您需要跳转到50000页呢?你会发现这个时间快的“感人”……

一、为什么OFFSET这么慢?

好吧,在大多数情况下,低偏移量查询并不慢。问题始于高偏移值。

如果查询使用以下limit子句:“ LIMIT 50000,20”,则它实际上是在请求数据库遍历50,020行并丢弃前50,000条。此操作可能会花费较高的成本来影响响应时间。

就像搜索引擎,百度、谷歌、搜狗、360等等每次查询数据均是几百万条甚至几千万条,这要是limit子句查询几乎是一场灾难。所以此时索引是一个特别好的助力。

在大多数Web应用程序中,笔者允许用户跳到最后一页,而不仅跳到下一页。当用户在访问第2页后尝试跳至50,000页时会发生什么?

如果用户从百度搜索结果中进入第20,000页,在其中点了什么喜欢的东西并将其发布在微信上,以供另外1000个朋友阅读,该怎么办?

笔者通过以下查询测试了以下OFFSET值,偏移量越大性能越差。

该查询在包含用户执行的事件(分析表)的表上执行,该表具有150,000条记录。

传统分页 

分页性能下降 

性能降低的十分严重:

性能下降分析图 

二、如何优化慢速OFFSET查询?

优化慢速OFFSET查询,您可以限制一个页面中允许的页面数量 分页查看,或者只是不使用OFFSET。

简单来说,seek方法就是寻找唯一的一列或一组标识每一行的列。然后,无需使用OFFSET子句,我们可以将该唯一值用作书签 从WHERE子句中的该位置开始,它显示了我们已获取的最后一行的位置,并查询了下一组行。

例如,查看我们之前执行的查询,假设偏移量999,999中的最后一个事件ID为“ 111866”,则查询将为:

 分页查询改进1

编写查询的另一种方法是:

分页查询改进2 

特别提醒:需要保障键值唯一性,以便页面之间的顺序始终保持不变,否则可能会出现意外突发错误

此时我们再看查询的性能

改进后性能与原性能对比 

虽然也有性能减弱的趋势,但总体趋于平缓,在可接受的范围内!

可能对您有帮助的文档《MySQL存储过程(procedure)其优势有哪些?

热门标签
new year
在线咨询
咨询热线 400-1515-720
投诉与建议
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待