《MySQL慢查询优化》之数据库表结构优化

1、前言  

  慢查询优化方式通常分为四个层次(如下),换句话说,也是这四个维度影响着慢查询,因此也是我们优化SQL的方向。

  • 服务器硬件升级优化

  • Mysql服务器软件优化

  • 数据库表结构优化

  • SQL语句及索引优化

本文重点关注于数据库表结构优化方式,关于其他优化方式以及索引原理等,请关注本人《MySQL慢查询优化》系列博文。

 

2、数据库三大范式

  数据库的设计范式是指关系型数据库设计所需满足的规范,满足这些规范的数据库结构清晰、冗余较少,维护更加方便。
目前,关系型数据库设计范式有六种:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
其中,我们常用的有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF),简称三大范式。

  • 第一范式(1NF):列不可分割

每一列属性都是不可再分的属性,确保每一列的原子性。

 

  • 第二范式(2NF)属性完全依赖于主键

第二范式(2NF)是在第一范式(1NF)基础上建立的,即满足第二范式(2NF)前提必须先满足第一范式(1NF)。

要求表中只具有一个业务主键,其他非主键列必须完全依赖于主键列,而不能只与主键的某一部分列相关(主要针对联合主键而言)。

 

  • 第三范式(3NF)属性不依赖于其它非主属性,属性直接依赖于主键

在满足第二范式基础上,每一个非主键属性既不部分依赖于也不传递依赖于业务主键。

 

总结:

  三大范式重点在考虑数据库结构合理性以及减少数据冗余方面。也就是说,友好支持数据库的增删改操作,但是没有照顾数据库查询操作。

 

3、查询表结构优化

  通常,数据库设计会考虑需求、性能以及表结构三方面,其中,需求>性能>表结构。因此,需要根据实际业务场景以及性能要求设计合理的表结构,而不是严格遵守“三大范式”。另外,从查询性能上讲:单表查询>关联查询>子查询(嵌套中间表)。所以,常见的查询表结构优化方式有“反范式设计”。

所谓反范式设计,就是根据性能和读取效率的考虑,适当的违背数据库设计三大范式,允许存在少量的数据冗余,以空间换取时间,从而提高查询性能。

 

反范式设计规范:

  字段允许适当冗余,避免关联查询,以提高查询性能,但必须考虑数据一致性。冗余字段必须遵循:

  • 不是频繁修改的字段。
  • 不是varchar超长字段,更不能是text字段。
  • 不是唯一索引的字段。

 

posted @ 2020-12-13 18:11  马非白即黑  阅读(254)  评论(0编辑  收藏  举报