命名问题
- 所有关键字是小写加下划线
因为区分大小写,所以如DbName,dbname是两个不同的命名,所以在编程中统一用小写字母加下划线有助于避免开发时费神区分一些命名的情况。 - 禁用MySQL关键字
- 见名识意,最好不要超过32字符
- 临时表tmp ,备份表bak(后缀为日期)
- 关联id的名称类型最好为一样(为了避免查询时做隐式的类型转换)
设计规范:
Innodb存储引擎:5.6以后默认引擎,支持事务\行级锁,更好的恢复性,高并发下性能更好。
UTF-8字符集。
表和字段添加注释。
单表数据量尽量控制在500w以内(归档-日志表)。
尽量做到冷热分离(分列)。
禁止存储图片,文件等二进制数据
索引
单张表索引不要超过5个。
每个Innodb表必须有一个主键
不使用更新频繁的列作为主键,不使用多列主键。
不使用UUID, MD5, HASH,字符串列作为主键。
建议自动ID增
常见索引列建议:
select, update, delete语句的where从句中的列
包含在order by,group by ,distinct中的字段
多表join的关联列
避免冗余和重复索引
外键最好在业务端实现
避免TEXT、BLOB数据类型(拆分到单独表中)
避免用enum数据类型(会降低效率)
尽量定义为NOT NULL(比较和计算时)
用TIMESTAMP或DATETIME存储时间
财务相关用decimal存储(float和double是非精确的)
开发规范
使用预编译而不是动态sql
避免数据类型隐式转换
充分利用表上已经存在的索引:
避免使用双%的查询条件,一个SQL只能利用到符合索引中的一列进行范围查询。
程序连接不同的数据使用不同的账号,禁止跨库查询:
为数据库迁移和分库分表留出余地。
降低业务耦合度。
避免权限过大而产生的安全风险
- 禁止用select *
- 消耗更多的CPU和IO以及网络带宽资源
- 无法使用覆盖索引
- 可减少表结构变更带来的影响
禁止使用不含字段列表的INSERT语句
将子查询优化为join操作
避免使用JOIN关联太多的表(建议不超过5个)
减少同数据库的交互次数
禁止order by rand():推荐在程序中获取一些随机值
where 从句中禁止对列进行函数转换
第三范式:不存在传递关系。(只有两级)