来自军规的思考-mysql

有幸看到赶集网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列加索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值