-
数据库中的表
正则化:每个因素只表达一次
非正则化:存在信息冗余
示例
非正则化
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;
-
总结
这里面用到的冗余字段、额外索引、缓存表、汇总表的各种操作,目标都是加速查询,但是副作用是增加了复杂度和放慢了写入,所以要权衡利弊
chapter03_架构优化和索引_6_正则化和非正则化
最新推荐文章于 2020-11-27 14:47:45 发布