当前位置:   article > 正文

mysql limit过大 遍历的一些问题

mysql limit过大 遍历的一些问题

最近有个需求,让把db里面某张符合条件的数据都load出来,数据量略大,当然不能一次都拉出来,那自然就想到了limit,sql如下

  1. select *
  2. from my_table
  3. WHERE point_type=1003
  4. order by id limit 0,200

point_type 就是一个不带索引的普通字段

先是limit 0,1000 然后就是上一批数据的最大id,再次limit

但是很快就发生了问题,当offset很大的时候,sql基本就卡死了。

  1. select *
  2. from my_table
  3. WHERE point_type =1003
  4. limit 900000,200
  5. -- 耗时 3181

网上查了一点资料 - 阿里巴巴的java开发手册

 sql改成了如下:

  1. select a.*
  2. from my_table a
  3. right join (
  4. select id
  5. from my_table
  6. WHERE point_type =1003
  7. limit 900000,200
  8. ) b
  9. on a.id = b.id
  10. -- 680 ms
  11. select a.*
  12. from my_table a ,
  13. (
  14. select id
  15. from my_table
  16. WHERE point_type =1003
  17. limit 900000,200
  18. ) b
  19. where a.id = b.id
  20. -- 690 ms

确实有优化,但是不管是on 还是 where ,时间还是有点长

改成如下,耗时降低到6ms。而且 point_type 这个字段上并没有索引(当然id上是有索引的)

  1. select *
  2. from my_table
  3. WHERE id > 9427596100 and point_type=1003
  4. limit 1000
  5. -- 6ms

当然这个9427596100,是上一次查询的时候,返回的最后一条数据的id


参考资料

sql的连接 
https://www.runoob.com/mysql/mysql-join.html
https://blog.csdn.net/Kermit_father/article/details/85937406

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/492346
推荐阅读
相关标签
  

闽ICP备14008679号