超过 100W 行的批量写操作,要分批多次进行操作
- 大批量的操作可能会造成严重的主从延迟
- binlog日志为 row 格式时会产生大量日志
- 避免产生大事务操作
- 大的事务会导致数据库的阻塞时间过长
对于大表使用 pt-online-schema-change 修改表结构
- 避免大表修改产生的主从延迟
- 避免对表修改时,产生的表锁问题
- pt-online-schema-change 修改表结构时的流程
- 建立一个和源表结构相同的新表
- 在新表上进行表结构修改
- 创建触发器,将源表的数据操作复制到新表中
- 表复制完成后,将新表重命名为源表名,并删除源表
- 以此来完成表结构的修改,而不产生对源表的加锁操作
禁止为程序使用的账号赋予 super 权限
- 当数据库连接达到最大限制时,还允许 1 个super权限的用户连接
- 如果滥用 super 权限的话,会导致 DBA 无法登陆数据库检查问题
- super 权限只能留给 DBA 处理问题的账号使用
- 当数据库连接达到最大限制时,还允许 1 个super权限的用户连接
对于程序连接数据库账号,遵循权限注销原则
- 程序使用数据库账号只能在一个 DB 下使用,不准跨库
- 程序使用的账号原则上不准有 drop 权限
向DB 中插入 100W 条数据
如果每次只插入一条数据,则会增加和数据库的交互次数
如果批量插入,虽然只有一次交互,但是会产生非常大的事务,可能造成内存溢出
分段批量插入
JDBC 连接 URL 需要加上
allowMultiQueries=true
参数example by Mybatis Batch:
// Java 代码 pst.addBatch(); if(i > 0 && i%1000 == 0){ pst.executeBatch(); pst.clearBatch(); }
<!-- MyBatis SQL --> <insert id="insertbatch" parameterType="java.util.List"> <selectKey keyProperty="fetchTime" order="BEFORE" resultType="java.lang.String"> insert into tb_user (username,password) values <foreach collection="list" item="item" index="index" separator=","> ( #{item.username},#{item.password} ) </foreach> </selectKey> </insert>
《高性能MySQL》目录
- 第一章 数据库设计规范
- 第二章 数据库字段设计规范
- 第三章 数据库 SQL 开发规范
- 第四章 数据库操作行为规范
- 第五章 设计数据库分区表
- 第六章 MySQL存储引擎
- 第七章 MySQL 执行优化
- 第八章 MySQL 慢查询日志
- 第九章 MySQL 数据库备份与恢复
- 第十章 MySQL构架拆分
- 其他:MySQL表结构实践sql
- 其他2:MySQL常用命令