《高性能MySQL》第四章 数据库操作行为规范
  1. 超过 100W 行的批量写操作,要分批多次进行操作

    1. 大批量的操作可能会造成严重的主从延迟
    2. binlog日志为 row 格式时会产生大量日志
    3. 避免产生大事务操作
      1. 大的事务会导致数据库的阻塞时间过长
  2. 对于大表使用 pt-online-schema-change 修改表结构

    1. 避免大表修改产生的主从延迟
    2. 避免对表修改时,产生的表锁问题
    3. pt-online-schema-change 修改表结构时的流程
      1. 建立一个和源表结构相同的新表
      2. 在新表上进行表结构修改
      3. 创建触发器,将源表的数据操作复制到新表中
      4. 表复制完成后,将新表重命名为源表名,并删除源表
      5. 以此来完成表结构的修改,而不产生对源表的加锁操作
  3. 禁止为程序使用的账号赋予 super 权限

    1. 当数据库连接达到最大限制时,还允许 1 个super权限的用户连接
      1. 如果滥用 super 权限的话,会导致 DBA 无法登陆数据库检查问题
    2. super 权限只能留给 DBA 处理问题的账号使用
  4. 对于程序连接数据库账号,遵循权限注销原则

    1. 程序使用数据库账号只能在一个 DB 下使用,不准跨库
    2. 程序使用的账号原则上不准有 drop 权限
  5. 向DB 中插入 100W 条数据

    1. 如果每次只插入一条数据,则会增加和数据库的交互次数

    2. 如果批量插入,虽然只有一次交互,但是会产生非常大的事务,可能造成内存溢出

    3. 分段批量插入

      1. JDBC 连接 URL 需要加上 allowMultiQueries=true 参数

      2. example by Mybatis Batch:

      3. // Java 代码
        pst.addBatch();
        if(i > 0 && i%1000 == 0){
            pst.executeBatch();
            pst.clearBatch();
        }
      4. <!-- 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》目录

  1. 第一章 数据库设计规范
  2. 第二章 数据库字段设计规范
  3. 第三章 数据库 SQL 开发规范
  4. 第四章 数据库操作行为规范
  5. 第五章 设计数据库分区表
  6. 第六章 MySQL存储引擎
  7. 第七章 MySQL 执行优化
  8. 第八章 MySQL 慢查询日志
  9. 第九章 MySQL 数据库备份与恢复
  10. 第十章 MySQL构架拆分
  11. 其他:MySQL表结构实践sql
  12. 其他2:MySQL常用命令
文章作者: koral
文章链接: http://luokaiii.github.io/2019/06/20/读书笔记/《高性能MySQL》/4.数据库操作行为规范/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自