数据库军规:
核心军规
- 不在数据库做运算:CPU计算务必移至业务层;
- 控制单表数据量:含int型不超过1000w,含char则不超过500w;合理分表;限制单库表数量在300以内;
- 控制列数量:字段数控制在20以内;
- 平衡范式与冗余:为提高效率牺牲范式设计,冗余数据;
- 拒绝3B:拒绝大sql,大事务,大批量;
注:数据库三范式:
第一范式: 确保每列保持原子性
第二范式: 确保表中的每列都和主键相关
第三范式: 确保每列都和主键列直接相关,而不是间接相关
常用的方式:在一个数据库中设置主表,通过外键关联设置关联表,从而避免表过大。且每一个关联表尽量满足范式。
字段类军规
尽量使用足够描述的数据类型。
1. 用好数值类型:一些分类可以直接用数值型表示,在数据层加映射关系。
- tinyint(1Byte)
- smallint(2Byte)
- mediumint(3Byte)
- int(4Byte)
- bigint(8Byte)
2. 避免使用NULL字段
理由:
- NULL字段很难查询优化
- NULL字段的索引需要额外空间
- NULL字段的复合索引无效
可以用0表示默认的null值。示例:
bad case:
name char(32) default null
age int not null
good case:
age int not null default 0
3. 可转化为数字的字符尽量转,如IP。
4. 不在数据库里存图片
存图片的URL,并另起一个图片仓库。
5. 少用text/blob
varchar的性能会比text高很多
索引类军规
索引可以改善查询、减慢更新
但是索引一定不是越多越好(能不加就不加,要加的一定得加)
重复的记录条数过多不适合建索引,例如“性别”
SQL类军规
-
一条sql只能在一个cpu运算
-
大语句拆小语句,减少锁时间
注:一条大sql可以堵死整个库 -
简单的事务
事务时间尽可能短 -
不用select * (but 经常被违反)
-
OR改写为IN()(相同字段判断)或者UNION(不同字段判断)
or的效率是n级别
in的效率是log(n)级别
in的个数建议控制在200以内
select id from t where phone=’159′ or phone=’136′;
改写成:
select id from t where phone in (’159′, ’136′);
select id from t where phone = ’159′ or name = ‘john’;
改写成:
select id from t where phone=’159′
union
select id from t where name=’jonh’
网友评论