基本规范
- 所有表必须使用Innodb存储引擎
Innodb存储引擎是Mysql5.6以后默认引擎
支持事务,行级锁,更好的恢复性,高并发下性能更好 - 数据库和表的字符集统一采用utf8
兼容性更好(不支持手机表情)
避免由于字符集转换产生的乱码 - 所有表和字段都需要添加注释
- 禁止在数据量存储图片,文件等二进制数据
- 单表数据最好控制在500万以内
- 尽量做到冷热数据分离,经常一起使用的列放在一起
减少磁盘IO,更有效利用缓存 - 禁止在表中建立预留字段
命名规范
- 数据库库名,表名必须使用小写字母并用下划线分割
inxedu_customer_zhangqiang_wx - 数据库字段名命名使用驼峰格式
- 要做到见名识意,不要超过32字符,禁止使用关键字
https://dev.mysql.com/doc/refman/5.7/en/keywords.html - 所有存储相同数据的列名和列类型必须一致
字段规范
- 优先选择符合存储需要的最小的数据类型,过大长度会消耗更多的内存
- unsigned
- varchar
- 避免使用text,blob数据类型
tinytext,text,midumtext,longtext
text(64kb)
建议把text,blob列分离到单独的扩展表中 - 避免使用enum数据类型
禁止使用数值作为enum值 - 尽可能把所有列定义为not null
- 不要用字符串存储日期时间
使用timestamp或datetime
timestamp 1970-01-01 00:00:00 ~ 2038-01-19 03:1407 - 财务相关的金额类型必须使用decimal类型
索引规范
- 限制每张表索引数量,单表索引不超过5个
禁止给表中每一列都建立单独的索引 - 每个Innodb表必须有一个主键
- select,update,delete的where从句中的列
order by,group by,distinct中的字段
多表join的关联列 - 区分度 count(distinct 列名)/count(*)
- 覆盖索引
- 避免使用外键(但是要建立索引)
开发规范
- 充分利用表上已经存在的索引
- 避免使用双%的查询条件
- 避免使用not in
- 禁止跨库查询
- 禁止使用select *
- 禁止使用不包含字段列表的insert
- 避免使用子查询
子查询结果集无法使用索引
子查询会产生临时表 - 避免使用join关联太多的表,建议不超过5个
- 使用in代替or
- 拆分复杂的大sql为多个小sql
- 更新异常
执行计划
- explain
system,count,eq_ref,ref,ref_or_null,index_merge,range,index,all
慢查询日志
- set global slow_query_log_file=/sql_log/slow_log.log;
set global log_queries_not_indexes=on;
set global long_query_time=0.001;
set global slow_query_log=on; - mysqldumpslow 文件名