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字段。
- 不是唯一索引的字段。