当前位置: 首页 > 面试题库 >

如何对MySQL的limit分页查询进行优化?

空鸿云
2023-05-12

针对分页这个问题,了解其为什么慢就知道优化方法了,按我的理解如下:


(1)以前select * from table order by column limit 100, 10这种方式,分页是怎么分的呢,是从磁盘拿整一个数据页到存储引擎缓冲区,比如 limit 100, 10 那就要按顺序先取出前100条数据,跳过了offset后再拿出第[100,110]这10条数据,如果这条数据字段很多且体积比较大,那么数据页就会比较大,我们知道存储引擎内存页大小是有限制的,如果数据页较大,那可能一次内存页只能存一两条数据,那么每次磁盘IO只能取到一两条,所以要翻掉前100条,那就可能需要非常多次的IO,这就是为什么慢的原因。


(2)针对上述问题,主要有两种优化思路,第一种就是针对“按顺序取前100条”这个问题,那我是不是可以不用取完前面100条就能拿到第[100,110]条呢?方法的话比如改造limit 100,10这个sql,用where id > 100 limit 10,这样的话可以按 id 主键索引先定位到哪个磁盘数据页,然后按顺序取10条数据就好了。


(3)第二种思路是针对“取大数据页到内存进行过滤”的问题,那我能不能把数据页做小,使得一个内存页能容纳更多条数据,从而减少磁盘IO次数?又或者我直接通过索引页来过滤,这样就不需要用原数据页来进行内存计算?这就是类似博主所述的方法,就是通过select id from table limit 100,10先分页查出id,再回表查询将这10个id的数据取出来就好了,因为id是主键索引,所以拿id来内存计算,就比拿一整页数据计算,IO次数要少的多了(甚至,存储引擎可能把id索引页都缓存到cache中了的话,压根都不需要硬盘IO了)。此外,order by的字段尽量要是索引字段,比如order by id,所以建表的时候考虑到要分页查询的话,尽量保证id的自增序就是分页的顺序/逆序,这样分页排序就能直接order by id了。


当在进行分页查询时,如果执行limit 9000000,10,此时需要MySQL排序前9000010记录,仅仅返回9000000 - 9000010的记录,其他记录丢弃,查询排序的代价非常大 。

优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化

select*
from tb_sku t.
   (select id from tb_sku order by id limit 9000000,10) a
where thg = a.id;

先分页查询数据的同字段,确定了id之后,再用子查询来过滤,只查询这个试列表中的数据,因为查询id的时候,走的覆盖索引,所以效率可以提升很多。


 类似资料:
  • 本文向大家介绍Mysql优化技巧之Limit查询的优化分析,包括了Mysql优化技巧之Limit查询的优化分析的使用技巧和注意事项,需要的朋友参考一下 前言 在实际业务中对于分页来说是一个比较常见的业务需求。那么就会使用到limit查询,当我们在使用Limit查询的时候,在数据比较小、或者只查询前面一部分数据的时候效率是很高的。但是当数据量大的时候,或者查询offset数量比较大的时候,如:lim

  • 本文向大家介绍MySQL对limit查询语句的优化方法,包括了MySQL对limit查询语句的优化方法的使用技巧和注意事项,需要的朋友参考一下 当我们的网站达到一定的规模时,网站的各种优化是必须要进行的。而网站的优化中,针对数据库各种优化是最重点的了。下面作者将要和大家分享一下MySQL数据库中的查询语句有关limit语句的优化。 大家都知道一般limit是用在分页的程序的分页上的,当你的应用数据

  • 问题内容: 我有一个示例页面,该页面使用2个PHP文件和一个MySql数据库,并且我正在尝试在其上使用jQuery无限滚动。如何从数据库加载下一组数据?例如,我的图片数据库中有100条记录,我想显示20条,然后在滚动后显示下20条。 这是我目前的核心: index.php images.html 问题答案: 您需要添加到查询中。MySQL手册中的示例: 在这里,是起始偏移量,是您要获取的行数。 对

  • 问题内容: 如标题所述,我想要一个解决方法… 干杯 问题答案: 您可能会希望将an添加到嵌套查询中。

  • 本文向大家介绍在MySQL中使用LIMIT进行分页的方法,包括了在MySQL中使用LIMIT进行分页的方法的使用技巧和注意事项,需要的朋友参考一下 今天看一个水友说他的MySQL现在变的很慢。问什么情况时。说单表超过2个G的一个MyISAM。真垃圾的回答方式。     简单答复:换一个强劲的服务器。换服务器很管用的:) ………        最终让取到慢查询:   如:             看

  • 本文向大家介绍mysql优化limit查询语句的5个方法,包括了mysql优化limit查询语句的5个方法的使用技巧和注意事项,需要的朋友参考一下 mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须

  • 本文向大家介绍MYSQL分页limit速度太慢的优化方法,包括了MYSQL分页limit速度太慢的优化方法的使用技巧和注意事项,需要的朋友参考一下 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。    当一个表数据有几百万的数据的时候成了问题!    如 * from table limit 0,10

  • 问题内容: 我想将表中的行从1001开始更新到下一个1000。 我尝试了以下查询: 这给了我语法错误。它是否正确?我在这里犯任何错误吗? 我们可以这样限制更新吗? 另外,我尝试更新的行的数据类型为INTEGER的列p_id具有Null值。因此,我什至无法使用以下查询进行更新: 我上面的查询正确吗? 要做到这一点怎么办? 问题答案: 处理null时,不匹配null值。您可以使用或 可以与但只能一起使