小蚂蚁学习mysql性能优化(8)--数据库结构优化--范式化和反范式化,水平分表,垂直分表

范式化和反范式化
数据库

    范式化是指数据库设计的规范,目前说到范式化通常是指第三设计范式,也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖,则符合第三范式。数据库设计

    呵呵,这说了个嘛玩意哈/(ㄒoㄒ)/~~,直接举例:函数

商品名称        价格        重量        有效期        分类        分类描述优化

可乐                3.00        250ml     2015.10    饮料        碳酸饮料spa

苹果                5.00        100g        2015.10    水果        新鲜水果设计

分类和分类描述相对于商品名称来讲,他们是存在着依赖关系的,分类描述依赖于分类,而分类依赖于商品名称,也就是说存在非关键字段“分类描述”对关键字段“商品名称”的传递函数依赖,这就形成了不少的麻烦,好比进行增删改操做的时候。这就须要对表进行拆分,将分类和描述单独列出来。hash

1.效率

商品名称        价格        重量        有效期后台

可乐                3.00        250ml        2015.10方法

苹果                5.00        100g            2015.10

2.

分类            分类描述

酒水饮料        碳酸饮料

生鲜食品        水果

3.

分类            商品名称

酒水饮料        可乐

生鲜食品        苹果

这样将一个表一分为三以后就符合了第三范式要求。

反范式化

    反范式化是指为了查询效率的提升把本来符合第三范式的表适当的增长冗余,以达到优化查询效率的目的,反范式化是一种以空间换时间的操做。

    这个就不举列子了,简单的说,就是原本须要关联不少表的查询,把他们写到一张表中,这样只须要查一张表就能够了,虽然增长了数据冗余,但执行效率快了不少,说白了,少关联一些表。

表的垂直拆分

    所谓垂直拆分,就是把原来一个不少列的表拆分红多个表,这解决了表的宽度问题,一般垂直拆分何以按照如下原则进行:

    1.    把不经常使用的字段单独放到一个表中

    2.    把大字段独立存放到一个表中

    3.    把常常一块儿使用的字段放到一块儿

这个以前也有提到,不用多说。

表的水平拆分

    表的水平拆分主要是为了解决单张表数据量过大的问题,水平拆分的表每个表的结构都是彻底一致的。

经常使用的水平拆分方法为:

  1.     对customer_id进行hash运算,若是要查分红5个表,则使用mod(customer_id,5)取出0-4个值

   2.      针对不一样的hashID把数据存到不一样的表中 

挑战:1.    跨分区表进行数据查询    2.    统计及后台报表操做。

相关文章
相关标签/搜索