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

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

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条记录。

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

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

性能降低的十分严重:

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

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

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

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

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

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

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

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

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

此时我们再看查询的性能

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

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

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

长按二维码,关注我们

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

新睿云,让云服务触手可及

云主机|云存储|云数据库|云网络

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