mysql 查询优化~ 分页优化讲解

一 简介:今天咱们来聊聊mysql的分页查询

二 基本逻辑 

limit深分页,导致SQL变慢原因有两个:

   limit语句会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。也就是说limit 100000,10,就会扫描100010行,而limit 0,10,只扫描10行

   limit 100000,10 扫描更多的行数,也意味着回表更多的次数。

二 语法
     LIMIT [offset,] rows
     offset是第多少条
     rows代表多少条之后的行数
    性能消耗
    select * from table limit 0,10;
    select * from table limit 1000,10;
    很快
    select * from table limit 3000000,10;
    非常慢了

三  优化 
   原因:比如你要查询 300w开始后面10条数据;mysql会读取300w加10条这么多的数据,只不过 过滤后返回最后10条而已!!!所以导致分页查询越到后面越慢
  1 直接使用select本身进行查询,并不进行任何优化
     SELECT * FROM 表名称 LIMIT M,N
     select * from table limit 3000000,10
  2 采用唯一性索引(最好是主键)进行范围限定再进行分页处理
     改写后
     select * from table where id>3000000 limit 10;
 3  按照索引分页后回表读取行的方式
     改写后
     select table.* from table inner join ( select id from table limit 3000000,10 ) as tmp on tmp.id=table.id;
4  限定查询范围,锁定页数
    select * from table limit 1000,10; 只限定页

四 总结

  对于无法通过优化解决的分页查询,建议通过1 减少表数据量 2 减少查询频率 3 设置读写分离进行解决

五 补充

   配置limit的偏移量和获取数一个最大值,超过这个最大值,就返回空数据。
  因为他觉得超过这个值你已经不是在分页了,而是在刷数据了,如果确认要找数据,应该输入合适条件来缩小范围,而不是一页一页分页

 

posted @ 2018-02-26 14:40  开心的蛋黄派  阅读(535)  评论(0)    收藏  举报