Sql优化 - 表结构优化

选择合适的数据类型

  • 使用可以存下的数据的最小的数据类型
  • 使用简单的数据类型
  • 尽可能使用 not null 定义字段
  • 尽量少用text类型,非用不可时最好考虑分表

表的范式化和反范式化

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

  • 举例说明

    Sql优化 - 表结构优化
    存在以下传递函数依赖关系
    (商品名称)->(分类)-> (分类描述)

  • 此时这张表将不符合第三范式的要求,将其拆分

    Sql优化 - 表结构优化

  • 通过上面的拆分,我们发现在查询的时候需要进行联表查询,因此效率上就会变慢,因此有了反范式化的概念,指的是对符合第三范式要求的表适当增加冗余,提高查询效率

    Sql优化 - 表结构优化
    此时我们要查询订单的详细信息 我们就需要进行联表查询,类似于下面的sql语句

    Sql优化 - 表结构优化
    此时可以进行反范式化

    Sql优化 - 表结构优化
    此时sql变为以下方式,提高了查询效率
    Sql优化 - 表结构优化

数据表的垂直拆分

  • 将原来一个很多列的表拆分成多个表,这样就会解决表的宽度问题。通常垂直拆分可以按照以下原则进行
    • 把不常用的字段单独放到一个表
    • 把大字段独立存放到一个表中
    • 把经常一起使用的字段放到一起

数据表的水平拆分

  • 表的水平拆分是为了解决单表的数据量过大,水平拆分的表的结构也是一致的
      payment - 总表
      payment_1 ... payment_n
  • 常见的水平拆分法为 对主键进行hash运算,假如我们需要拆分5张表,那么我们可以 mod(id, 5)取出0,1,2,3,4,针对不同的hashid插入到相应的表中
    • 此时会面临跨分区表进行查询、后台统计等
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!