58到家数据库30条军规--我的学习
基础规范
1 禁止使用存储过程、视图、触发器、Event
上面的会消耗cpu,当并发量大时,会把数据库拖死。
2 禁止存储大文件或者大图片
数据库擅长存储与索引,而大文件和图片交给文件系统,数据库只存储uri就可以了。
字段设计规范
1 必须把字段定义为NOT NULL并且提供默认值
Mysql会对null字段进行特殊数据,会增加数据库的复杂度和额外的空间
2 禁止使用TEXT、BLOB类型
会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能
索引使用规范
1 单表索引建议控制在5个以内
2 单索引字段数不允许超过5个
解读:字段超过5个时,实际已经起不到有效过滤数据的作用了
3 禁止在更新十分频繁、区分度不高的属性上建立索引
解读:
a)更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能
b)“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似
4 建立组合索引,必须把区分度高的字段放在前面
解读:能够更加有效的过滤数据
sql使用规范
1 禁止用or,用in来代替
原因:in的效率高于or
2 禁用大表做join和子查询
原因:会浪费内存和cpu资源
3 禁用where的属性上使用函数和表达式
解读:SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 会导致全表扫描
正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')
4 禁止使用属性的隐式转换
解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引。
5 禁止使用insert into values(XXX,XXX)
容易在增加或者删除字段后出现程序BUG