chapter03_架构优化和索引_6_正则化和非正则化

  • 数据库中的表

    正则化:每个因素只表达一次

    非正则化:存在信息冗余

    示例

    非正则化

      employee  |   department   |   head
      -------------------------------------
       Jones    |   Accounting   |  Jones
      -------------------------------------
       Smith    |  Engineering   |  Smith
      -------------------------------------
       Brown    |   Accounting   |  Jones
      -------------------------------------
       Green    |  Engineering   |  Smith
      -------------------------------------
    

    变成正则化以后的效果

      第一张表
    
      employee  |   department   
      ---------------------------
       Jones    |   Accounting   
      ---------------------------
       Smith    |  Engineering   
      ---------------------------
       Brown    |   Accounting   
      ---------------------------
       Green    |  Engineering   
      ---------------------------
    
      第二张表
    
       department  |   head
      -------------------------
       Accounting  |   Jones
      -------------------------
       Engineering |   Smith
    
  • 正则化架构的__优势__

    (1) 更新更快(原因是没有冗余数据记录)

    (2) 建好表后,改动数据较少

    (3) 正则化表比较小

    缺点

    (1) 经常需要联接,速度慢(原因是如果一张表的话是磁盘顺序访问,而多表联接是磁盘随机访问,速度差距很大)

    (2) 列分布于多个表,难以用索引加速查询

  • 结合两者的优势

    (1) 缓存表

    这些数据可以从原始表中获得,但是获取速度比较慢,因此用缓存表存储这些冗余数据

    (2) 汇总表

    含有GROUP BY查询取得的数据的表

    (3) 示例

    统计过去24小时的发帖子数量,可以建一个每小时发帖量的汇总表,然后查询的时候查汇总表中23小时的SUM()和原表一头一尾小时的发帖量,查询会加快

    (4) 使用缓存表时,可以使用不同的存储引擎加快速度

    例如原表为了支持事务要用InnoDB,但是缓存表可以用MyISAM减少索引大小,并且支持全文检索

    (5) 对于使用了InnoDB引擎的计数表(统计访问人数),可以充分利用InnoDB支持行级锁的特性提高并发程度,方法是添加一个随机列,这样插入时插的是不同的列

    示例

      CREATE TABLE hit_counter (
          cnt int unsigned not null,
          slot tinyint unsigned not null) ENGINE = INNODB;
    
      插入数据
    
      INSERT INTO hit_counter (slot, cnt) VALUES
      (RAND() * 100, 1)
      ON DUPLICATE KEY UPDATE cnt = cnt + 1;
    

    ON DUPLICATE KEY UPDATE的意思是如果行存在就更新数据,不存在就插入记录,这样引入了随机数就可以让cnt的更新发生在多行并发

      查询cnt
    
      SELECT SUM(cnt) FROM hit_counter;
    
  • 总结

    这里面用到的冗余字段、额外索引、缓存表、汇总表的各种操作,目标都是加速查询,但是副作用是增加了复杂度和放慢了写入,所以要权衡利弊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值