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条记录。
性能降低的十分严重:
二、如何优化慢速OFFSET查询?
优化慢速OFFSET查询,您可以限制一个页面中允许的页面数量 分页查看,或者只是不使用OFFSET。
简单来说,seek方法就是寻找唯一的一列或一组标识每一行的列。然后,无需使用OFFSET子句,我们可以将该唯一值用作书签 从WHERE子句中的该位置开始,它显示了我们已获取的最后一行的位置,并查询了下一组行。
例如,查看我们之前执行的查询,假设偏移量999,999中的最后一个事件ID为“ 111866”,则查询将为:
编写查询的另一种方法是:
特别提醒:需要保障键值唯一性,以便页面之间的顺序始终保持不变,否则可能会出现意外突发错误。
此时我们再看查询的性能
虽然也有性能减弱的趋势,但总体趋于平缓,在可接受的范围内!
可能对您有帮助的文档《MySQL存储过程(procedure)其优势有哪些?》
长按二维码,关注我们
新睿云,让云服务触手可及
云主机|云存储|云数据库|云网络