MySQL 使用规范


MySQL 使用规范

目前我们数据库使用缺乏一个统一的使用规范,这篇规范是我参考阿里的部分的BP以及赶集网的SQL 军规结合酷家乐自身的情况制定的。

约定

  1. 数据库操作与使用一定要按照规范进行
    
    1. 所有的变更必须提前4小时提交申请,进过审批后才能执行操作
      
      1. 全网变更必须经过线下测试,线上小规模验证后,才能全网推送
        
        1. 数据订正和数据提取必须经过团队leader审核通过后才能进行操作;
          
          1. 禁止未经正式审批进行查阅,变更,传播,移动线上数据;
            
            1. 禁止对无关人员提供系统登录和发布权限;
              
              1. 重大变更(数据库停机,扩容,迁移)必须团队review
                
                1. 新发布的任何sql都必须进过严格的审核,添加上必要的索引
                  
                  1. 线上的操作务必谨慎,必须在测试环境中完全验证后才能到线上执行,同时需要必要的数据备份
                    
                    1. 禁止在非变更窗口执行变更, 添加索引或者添加字段的操作, 都需要在业务的低峰期进行
                      
                      1. 禁止在程序端显式加锁 
                        
                        1. 统一字符集为UTF8, 排序规则为 UTF-generic-ci
                          
                          1. 统一命名规范 表名一律用大小写,schema设计避免关键字(MYSQL 关键字列表),索引使用同一前缀 index_ + colname 用下划线分割
                            

核心

  1. 尽量不在数据库做运算, 把MySQL作为一个存储组件
    
    1. 在设计表之前就把表将来的使用场景考虑清楚,做好相应准备
      
      1. 控制单表数据量 
        
        1. 保持表身段苗条 
          
          1. 平衡范式使用,不冗余非必要字段
            
            1. 拒绝3B: BIG SQL)   大事务 (BIG Transaction)  大批量 (BIG Batch)
              

Schema设计

  1. INNODB 引擎是你的最佳选择
    
    1. 用好数值字段类型 
      
      1. 将字符转化为数字, 如时间采用bigint, IP 采用 Unsigned Int, Enum 转为tinyint
        
        1. 比较小的表,通常情况下数据量小于5000的表,在未来的预期内也不会增加到比较大的,不用建立索引。
          
          1. 避免使用NULL字段 
            
            1. 不在在数据库里存图片
              
              1. 谨慎合理添加索引, 不要每个查询的字段都建立索引
                
                1. 字符字段必须建前缀索引 
                  
                  1. 不在索引列做运算 
                    
                    1. 自增列或全局ID做INNODB主键 
                      
                      1. 尽量不用外键
                        
                        1. 自增主键是你的最佳选择
                          
                          1. 新建表时总是设计添加冗余字段
                            

SQL 语句类

  1. SQL语句尽可能简单
    
    1. 保持事务(连接)短小 
      
      1. 尽可能避免使用SP/TRIG/FUNC 
        
        1. 尽量不用 SELECT *  改写OR语句 
          
          1. 避免负向查询和% 前缀模糊查询 
            
            1. 减少COUNT(*) 
              
              1. LIMIT的高效分页 可以用where pk > 之后limit num
                
                1. 避免单次数据库操作涉及行数过多的查询,此类查询没有加limit的都应该warning
                  
                  1. 尽量不使用UNION, 在代码里面实现Union
                    
                    1. 分解联接保证高幵发 
                      
                      1. GROUP BY 去除排序 
                        
                        1. order by,确认排序字段是否用到索引,避免filesort
                          
                          1. 在Update 操作的时候尽量不用 SELECT, 避免造成在此类操作的时候锁表
                            
                            1. 同数据类型的列值比较 
                              
                              1. Load data导数据 
                                
                                1. 打散大批量更新尽量不用 INSERT ... SELEC
                                  
                                  1. SQL 中 JOIN不超过两张表
                                    
                                    1. Know Your SQL!
                                      

Author: winjeg
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source winjeg !
  TOC