有幸看到赶集网DBA撰写的数据库36条军规,做些思考和整理
军规目录
一,核心军规(5)二,字段类军规(6)
三,索引类军规(5)
四,SQL类军规(15)
五,约定类军规(5)
一,核心军规
尽量不在数据库做运算
别让脚趾头想事情,那是脑瓜子的职责,让数据库多做她擅长的事情,尽量不在数据库做运算,复杂运算移到程序端CPU,尽可能简单应用MySQL
举例:md5() / order by rand()
思考:像rand()会引起扫全表,这个问题比较严重
控制单表数据量
一年内的单表数据量预估
纯INT不超过1000w
含CHAR不超过500w
合理分表不超载
USERID
DATE
AREA
思考:随着表中数据的增加,删除和修改的代价增加。比如锁,比如索引树的高度
保持表身段苗条
表字段数少而精
IO高效,全表遍历,表修复快,提高并发,alter table快
单表多少字段合适?
单表1G体积 500w行评估
顺序读1G文件需N秒
单行不超过200byte
单表不超过50个纯INT字段
单表不超过20个CHAR(10)字段
单表字段数上线控制在20-50个
平衡范式与冗余
平衡是门艺术严格遵循三大范式?
效率优先、提升性能
没有绝对的对与错
适当时牺牲范式,加入冗余
但会增加代码复杂度
拒绝3B
数据库并发像城市交通
非线性增长
拒绝3B
大SQL(Big SQL)大事务(Big transaction)
大批量(Big batch)
二,字段类军规
用好数值字段类型
三类数值类型TINYINT(1 byte)
SMALLINT(2B)
MEDIUMINT(3B)
INT(4B), BIGINT(8B)
FLOAT(4B), DOUBLE(8B)
DECIMAL(M,D)
将字符转化为数字
数字型VS字符串型索引
更高效查询更快
占用空间更小
举例:用无符号INT存储IP,而非CHAR(15)
INT UNSIGNED
INET_ATON()
INET_NTOA()
优先使用ENUM或SET
字符串可能值已知且有限
存储
ENUM占用1字节,转为数值运算
SET视节点定,最多占用8字节
比较时需要加'单引号(即使是数值)
举例
`sex` enum('F','M') COMMENT '性别'
`c1` enum('0','1','2','3') COMMENT '职介审核'
避免使用NULL字段
避免使用NULL字段很难进行查询优化
NULL列加索引