面试

数据库军规

2018-08-25  本文已影响0人  小张同学_loveZY

数据库军规:

核心军规

  1. 不在数据库做运算:CPU计算务必移至业务层;
  2. 控制单表数据量:含int型不超过1000w,含char则不超过500w;合理分表;限制单库表数量在300以内;
  3. 控制列数量:字段数控制在20以内;
  4. 平衡范式与冗余:为提高效率牺牲范式设计,冗余数据;
  5. 拒绝3B:拒绝大sql,大事务,大批量;

注:数据库三范式:

第一范式: 确保每列保持原子性

第二范式: 确保表中的每列都和主键相关

第三范式: 确保每列都和主键列直接相关,而不是间接相关

常用的方式:在一个数据库中设置主表,通过外键关联设置关联表,从而避免表过大。且每一个关联表尽量满足范式。

字段类军规

尽量使用足够描述的数据类型。

1. 用好数值类型:一些分类可以直接用数值型表示,在数据层加映射关系。

- tinyint(1Byte)
- smallint(2Byte)
- mediumint(3Byte)
- int(4Byte)
- bigint(8Byte)

2. 避免使用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类军规

  1. 一条sql只能在一个cpu运算

  2. 大语句拆小语句,减少锁时间

    注:一条大sql可以堵死整个库

  3. 简单的事务

    事务时间尽可能短

  4. 不用select * (but 经常被违反)

  5. 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’
上一篇 下一篇

猜你喜欢

热点阅读