MySQL 使用规范
目前我们数据库使用缺乏一个统一的使用规范,这篇规范是我参考阿里的部分的BP以及赶集网的SQL 军规结合酷家乐自身的情况制定的。
约定
数据库操作与使用一定要按照规范进行所有的变更必须提前4小时提交申请,进过审批后才能执行操作全网变更必须经过线下测试,线上小规模验证后,才能全网推送数据订正和数据提取必须经过团队leader审核通过后才能进行操作;禁止未经正式审批进行查阅,变更,传播,移动线上数据;禁止对无关人员提供系统登录和发布权限;重大变更(数据库停机,扩容,迁移)必须团队review新发布的任何sql都必须进过严格的审核,添加上必要的索引线上的操作务必谨慎,必须在测试环境中完全验证后才能到线上执行,同时需要必要的数据备份禁止在非变更窗口执行变更, 添加索引或者添加字段的操作, 都需要在业务的低峰期进行禁止在程序端显式加锁统一字符集为UTF8, 排序规则为 UTF-generic-ci统一命名规范 表名一律用大小写,schema设计避免关键字(MYSQL 关键字列表),索引使用同一前缀 index_ + colname 用下划线分割
核心
尽量不在数据库做运算, 把MySQL作为一个存储组件在设计表之前就把表将来的使用场景考虑清楚,做好相应准备控制单表数据量保持表身段苗条平衡范式使用,不冗余非必要字段拒绝3B: BIG SQL) 大事务 (BIG Transaction) 大批量 (BIG Batch)
Schema设计
INNODB 引擎是你的最佳选择用好数值字段类型将字符转化为数字, 如时间采用bigint, IP 采用 Unsigned Int, Enum 转为tinyint比较小的表,通常情况下数据量小于5000的表,在未来的预期内也不会增加到比较大的,不用建立索引。避免使用NULL字段不在在数据库里存图片谨慎合理添加索引, 不要每个查询的字段都建立索引字符字段必须建前缀索引不在索引列做运算自增列或全局ID做INNODB主键尽量不用外键自增主键是你的最佳选择新建表时总是设计添加冗余字段
SQL 语句类
SQL语句尽可能简单保持事务(连接)短小尽可能避免使用SP/TRIG/FUNC尽量不用 SELECT * 改写OR语句避免负向查询和% 前缀模糊查询减少COUNT(*)LIMIT的高效分页 可以用where pk > 之后limit num避免单次数据库操作涉及行数过多的查询,此类查询没有加limit的都应该warning尽量不使用UNION, 在代码里面实现Union分解联接保证高幵发GROUP BY 去除排序order by,确认排序字段是否用到索引,避免filesort在Update 操作的时候尽量不用 SELECT, 避免造成在此类操作的时候锁表同数据类型的列值比较Load data导数据打散大批量更新尽量不用 INSERT ... SELECSQL 中 JOIN不超过两张表Know Your SQL!