分页查询慢的优化方式

比眉伴天荒 2024-03-16 09:24 128阅读 0赞

大家好呀,我是柚子。这篇文章的起因呢,是因为项目中有一个分页查询比较慢的sql需要优化。
分页查询也是我们项目中经常使用的查询方式,那么如何优化呢?

文章目录

  • 案例
  • 一、先定位偏移位置的 id,然后往后查询,适于 id 递增场景
  • 二、可以使用 id 限定优化
  • 总结

案例

场景:表里有大量数据,一次性查询出来肯定会非常慢,那么考虑使用批量查询的方式。
方法一:根据分页和计算偏移量查询,如每200条分一次页,但是会存在一个问题。如果表里的数据量越大,这种方式会越慢,因为需要计算偏移量。
方法二:根据分页和主键查询,首先查出总记录数,再用总记录数算出分页页数,来循环取出数据。假如是倒序,用每次查出的最后一个主键id,小于这个主键id,每批向前取200条,这样就大大提高sql效率了。


提示:以下是本篇文章正文内容,下面案例可供参考

一、先定位偏移位置的 id,然后往后查询,适于 id 递增场景

select * from order where type=1 limit 100000,1;

第1条语句:3674ms

select id from order where type=1 limit 100000,1;

第2条语句:1315ms

select * from order where type=1 and
id>=(select id from order where type=8 limit 100000,1)
limit 100;

第3条语句:1327ms

select * from orders where type=1 limit 100000,100;

第4条语句:3710ms

从上面也是可以看出:
第1条直接select * 的话不走索引,会比较慢
第2条直接查询id,就走了索引,相对比较快
第3条虽然select *,但是先定位偏移位置的id,然后向后查询,也是比较快的

二、可以使用 id 限定优化

假设数据表的id是连续递增,则根据查询的页数和查询的记录数可以算出查询的id的范围,可使用 id between and:
sql如下(示例):

  1. select *
  2. from order
  3. where type = 1
  4. and id between 1000000 and 1000100
  5. limit 100;

总结

那么以上就是分页查询的优化方式了,小伙伴们可以采纳哦!


╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯

发表评论

表情:
评论列表 (有 0 条评论,128人围观)

还没有评论,来说两句吧...

相关阅读