今天做一个业务需求的逻辑处理,需要对MySQL全表进行遍历,数据规模百万级别,为方便描述,这张表就用 a 来代替吧

结合自己的思路和一些资料,在这里记录一下方案的进化史

一、直接遍历拿出所有的数据

select * from a ;

这个肯定不用多说了,估计还没拿完,内存就爆了,对这种数量级的表不现实

二、分页式循环遍历

select * from a limit 0,1000;select * from a limit 1000,1000。

在代码中,循环地使用这种模式的sql去遍历表,虽然可以实现,但显然这种方式是没法用到索引,越往后遍历性能会越低。

三、带索引链式遍历

select * from a where id > 0 order by id limit 10000;

假设上一次查询得到的结果集中,最后一条数据的id为10001select * from a where id > 10001 order by id limit 10000;

好,既然没用到索引,那就带上索引遍历。

类似的查询效果,由于where条件中的id字段有索引,对于比较靠后的数据,查询性能将会轻松提升很多(有人说是百倍左右,我没测试过就不说具体多少了)

那初步的优化方案就很容易想到了,id有索引,而且是自增的,就从id=1开始遍历,结果集以id升序排列,然后根据结果集最后一条数据的id,继续下一次遍历,依此类推,直到遍历完成

这个方案有个特点:下次遍历必须知道上次遍历的最后一个id的值,也就是前后遍历形成了一个依赖链,这将导致无法实现遍历行为之间的并行操作

四、id分区多线程遍历

找到表中最大最小id,确定id区间select min(id),max(id) from a ;

多线程遍历,每个线程每批次拿10000条记录,从min(id)开始,到max(id)结束

线程1:select * from a where id >= 1 and id <= 10000;

线程2:select * from a where id >= 100001 and id <=20000;

那如果我想多线程并行SQL查询处理呢?那我们可以尝试进行ID的区间划分,因为有了ID的分区,各个分区的查询就不存在必要的关联性了。

比如,第一个线程遍历id区间为1-10000的数据,第二个线程遍历id区间为10001-20000的数据,依此类推,直到遍历到最大id。这样就可以实现多个线程并行操作,性能也许会大大提升。

但不能说方案四一定比方案三好,要根据实际情况进行选择。方案四需要考虑ID的区间大小和SQL并行查询的线程数(数据库压力)。

而对于存储过程或游标之类,个人认为移植性和通用性不是很好,就没研究那方面的。

先写到这里,后续有什么好的方案,再补上!

参考:

共同学习,共同进步,若有补充,欢迎指出,谢谢!

mysql表的遍历_MySQL 全表遍历相关推荐

  1. 尽量使用覆盖索引,避免select * || 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到|| 如果MySQL评估使用索引比全表更慢,则不使用索引

    尽量使用覆盖索引,避免select * 尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少select * 7). 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索 ...

  2. mysql循环遍历获取_MySQL 全表遍历

    今天做一个业务需求的逻辑处理,需要对MySQL全表进行遍历,数据规模百万级别,为方便描述,这张表就用 a 来代替吧 结合自己的思路和一些资料,在这里记录一下方案的进化史 一.直接遍历拿出所有的数据 s ...

  3. mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描

    索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用.我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果. 首先说明,关 ...

  4. mysql in和or扫描全表_MySQL对OR条件查询不支持优化,会进行全表扫描

    MySQL对OR条件查询不支持优化,会进行全表扫描:explain extended select * from like1 where name like 'abc%';例如:+----+----- ...

  5. mysql unicode转汉字_Mysql数据库表引擎与字符集

    Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...

  6. mysql 分页 有序保证_MySql大表分页(附独门秘技)

    问题背景 MySql(InnoDB)中的订单表需要按时间顺序分页查询,且主键不是时间维度递增,订单表在百万以上规模,此时如何高性能地实现该需求? 注:本文并非主要讲解如何建立索引,以下的分析均建立在有 ...

  7. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  8. mysql 多表查询 优化_Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOI ...

  9. mysql多表查询方式_MySQL多表查询方式问题

    你的 SQL 没有用到任何索引,对 a b 两个表都是全表扫描,在数据量小的时候是没有问题的,但是如果数据量超过 100 万,性能问题就会突显出来. 这里不清楚你的 created_at 字段是什么类 ...

最新文章

  1. myeclipse maven 创建 web项目
  2. Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析
  3. 深度优先遍历算法-03二叉树路径遍历问题
  4. 局域网限速软件_2号破解app重器推荐一款强大的快捷软件
  5. viewController详解
  6. WebSocket简单使用(二) - 客户端
  7. Volley源码学习2--cache类
  8. 根据流程部署ID来获取流程定义图片
  9. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
  10. 在更新.net 4.5补丁后,VS2012突然不能打开项目,卸载补丁之后解决。
  11. linux分区整数计算器,整数G分区计算工具
  12. 应用回归分析第五版pdf百度网盘_常用软件分享PDF转换word/excel/text等
  13. PR简单压缩视频、音频、调整音频声音大小
  14. Python函数学习心得
  15. 如何搭建WordPress个人博客网站?
  16. pdfbox / XSL + FOP 转换 PDF文档
  17. [日推荐] 『紫砂壶平台』一把紫砂,一种品味
  18. 通过电话拨号上网的家用计算机,拨号上网需计算机、电话线、帐号和()
  19. Leetcode 1905. Count Sub Islands [Python]
  20. css中text文字超出宽度省略号显示并鼠标悬停显示剩余全部:

热门文章

  1. nginx缓存、压缩配置
  2. [刘阳Java]_CSS数字分页效果
  3. Tcl与Design Compiler (十)——其他的时序约束选项(一)
  4. WPF中两个窗口的互斥
  5. 计算机指令就是一串开关吗,什么是非法关机?常按计算机开关,还是直接拔掉电源插头才算啊?...
  6. centos 6.8 升级mysql_centos6.8 Mysql5.6.22 升级 mysql-5.7.20
  7. (篇九)C语言统计某个字母的个数、统计各种字符的个数、统计单词的个数
  8. 初学者python笔记(文件的操作)
  9. Java算法之旋转数组
  10. VUE-用到的样式左右(transform,translate,padding)