mysql 分页 limit 优化

二次信任 提交于 2020-02-27 14:31:11

1.语法:

      *** limit [offset,] rows

      一般是用于select语句中用以从结果集中拿出特定的一部分数据。

      offset是偏移量,表示需要的数据是跳过多少行数据之后的,可以忽略;rows表示要拿多少行数据。

2,场景:

前台要展示数据库中数据,需要后台实现分页,传入数据要有“页码page”跟“每页数据条数nums”。

    select * from t_table order by id limit (page-1)*nums,nums

3.问题:

当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢

      select * from t_table order by id limit 10000000,10

      上边SQL语句表示从表t_table 中拿数据,跳过10000000行之后,拿10行

4.优化思路:

     1.能不能跳过10000000条数据然后读取10条,而不是读取10000010条数据然后返回10条数据。

     2.order by字段需要建立索引

  改进后的SQL语句如下:

       select * from t_table where id >= ( select id from t_table order by id limit 10000000,1 ) limit 10 

注:假设id是主键索引,那么里层走的是索引,外层也是走的索引,所以性能大大提高

  5.总结

当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,需增加order by,并且order by字段需要建立索引。
   如果使用子查询去优化LIMIT的话,则子查询必须是连续的,某种意义来讲,子查询不应该有where条件,where会过滤数据,使数据失去连续性。
   如果查询的记录比较大,并且数据传输量比较大,比如包含了text类型的field,则可以通过建立子查询。
     

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!