美文网首页面试
数据库军规

数据库军规

作者: 小张同学_loveZY | 来源:发表于2018-08-25 22:10 被阅读0次

    数据库军规:

    核心军规

    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字段

    理由:
    • 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类军规

    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’
    

    相关文章

      网友评论

        本文标题:数据库军规

        本文链接:https://www.haomeiwen.com/subject/zclqiftx.html