MYSQL优化之大量数据的limit分页优化

   在mysql中,如果我们遇到要查询分页列表的数据,我们正常的sql语句是这样写的(主键索引为user_id):

select * from user where 各种条件 limit 0,10

这句sql乍一看非常直接明了,没啥毛病,但是当我们的数据量达到了几百万条时,我们要查几万条数据之后的分页,那要怎么处理呢?简单啊,这样写就好了:

select * from user where 各种条件 limit 50000,10

然而,事情并没有想象中的简单,当我们以这样的方式去查询时,mysql会如何处理呢?

首先,它会根据我们的主键索引去把所有的50010拿出来,然后再通过主键ID回表去把所有的*里面的各种字段查出来,最后截取最后的10条数据作为我们最终的返回值。这会出现一个很大的浪费,我们其实并不需要前面的50000条数据,更不需要这50000条数据回表查出来的各个字段,这将严重浪费查询时间。此时该如何优化呢?请看下面的代码:

SELECT
	* 
FROM
	USER u1
	RIGHT JOIN ( SELECT user_id FROM USER WHERE
	各种条件 LIMIT 50000, 10 ) u2 
    ON u1.user_id = u2.user_id 

这个查询咋一看好像多此一举,为什么要将同一张表连表查出ID,然后再进行查询其他字段的操作呢?如果我们这样操作的话,当我们子查询去根据主键索引把50010条数据都查出来后,由于索引里面已经存放了主键的值了,因此他就不需要回表再进行查询其他各种字段,此时,子查询limit结束后,只剩下了10条数据,再对这10条数据进行查询所有的字段,那么我们就相当于省略了一次50000条的所有字段查询,因此就能够极大的增加我们的查询效率。

根据此处的例子就不得不说一下limit的弊端了,由于它是最后执行的,所以当我们limit m,n时,mysql会进行先查m+n条数据,然后再对其截取最后n条数据,因此当分页数量极大时,他会大大降低查询的效率,导致即使使用了索引也无法提升性能,就是因为他的回表查询其他字段的机制导致了大量时间的花销。

这招大家学会了没!!!有收获点个赞呗

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL中,LIMIT是一种用于分页查询的优化技术。它可以限制查询结果集的返回行数。根据引用\[2\],如果你只需要返回结果集中的特定几行数据,通常使用LIMIT而不是取回整个结果集再舍去不需要的数据。这样可以减少数据传输和处理的开销。 在引用\[1\]中提到,随着查询结果集的增大,未经优化的SQL语句的执行时间会显著增加。而经过优化的SQL语句在相同条件下执行时间较短。这是因为优化后的SQL语句只返回需要的行数,而不会取回整个结果集。 为了进一步优化分页查询,可以使用OFFSET和LIMIT结合使用。OFFSET用于指定查询结果集的起始位置,而LIMIT用于指定返回的行数。通过使用OFFSET和LIMIT,可以避免取回不需要的数据,提高查询效率。 根据引用\[3\]的示例,可以将SQL语句修改为类似以下的形式: SELECT * FROM table_name LIMIT offset, limit; 其中,offset表示起始位置,limit表示返回的行数。 总结起来,MySQL中的LIMIT分页优化技术可以通过限制返回结果集的行数,减少数据传输和处理的开销。使用OFFSET和LIMIT结合使用可以进一步优化分页查询,避免取回不需要的数据,提高查询效率。 #### 引用[.reference_title] - *1* *2* [MySQL中的limit分页优化](https://blog.csdn.net/coco3600/article/details/100232404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MySQL分页你还在使劲的limit?](https://blog.csdn.net/qq_21454973/article/details/125935012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值