MySQL——优化数据库结构

30 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

1、拆分表:数据冷热分离

拆分表的思路是,把1个包含很多字段的表拆分成2个或者多个相对较小的表。

这样做的原因是,这些表中某些字段的操作频率很高(热数据),经常要进行查询或者更新操作,而另外一些字段的使用频率却很低(冷数据),冷热数据分离,可以减小表的宽度。

如果放在一个表里面,每次查询都要读取大记录,会消耗较多的资源。

2、增加中间表

对于需要经常联合查询的表,可以建立表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。

首先,分析经常联合查询表中的字段,然后,使用这些字段建立一个中间表并将原来联合查询的表的数据插入中间表;最后,使用中间表来进行查询。

3、增加冗余字段

需要进行多表查询的时候,可以进行反范式化,通过增加冗余字段增加查询效率。但要确保数据一致性。

4、优化数据类型

表字段的数据类型选择合理,可以采用数值类型就不要采用字符类型;字符类型要尽可能设计的短一点,当字符串长度固定时,就采用CHAR类型,当长度不固定时,采用VARCHAR。

避免使用 TEXT、BLOG这样的大数据类型。

使用TIMESTAMP(4字节)存储时间。

用DECIMAL 代替 FLOAT 和 DOUBLE 存储精确浮点数。

优先选择符合储存需要的最小的数据类型。

列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少,在遍历时所需要的IO次数也就越多,索引的性能也就越差。

修改数据类型,节省空间同时,要考虑到数据不能超过取值范围。

5、优化插入记录的速度

插入记录是影响插入速度的只要是 索引、唯一性约束和一次插入的记录条数等。

对于InNoDB引擎的表优化插入记录:

1、禁用唯一性检查

插入数据之前禁止对唯一索引的检查:

set unique_checks=0

插入数据后再开启:

set unique_checks=1

2、禁用外键检查

插入数据之前禁用外键检查:

set foreign_key_check=0;

插入数据之后再恢复:

set foreign_key_check=1;

3、禁止自动提交

插入数据之前关闭自动提交:

set autocommit=0;

插入数据之后再恢复:

set autocommit=1;

6、使用非空约束

在设计字段的时候,如果业务允许,建议尽量使用非空约束。这样做的好处是:

  • 进行比较和计算时,省去对NULL值的字段判断是否为空的开销,提高存储效率。
  • 非空字段也容易创建索引。因为索引NULL列需要额外的空间来保存,所以要占用更多的空间。使用非空约束就可以节省(1bit)存储空间。

7、分析表

分析表主要是分析关键词的分布

MySQL 提供了 ANALYZE TABLE 语句分析表,执行 analyze table 时,会对表加上读锁(read lock)

如果开启了binlog,那么Analyze Table的结果也会写入binlog,我们可以在analyze和table之间添加关键字local取消写入。

8、检查表

MySQL 中可以使用 CHECK TABLE 语句来检查表。CHECK TABLE语句能够检查innoDB和MylSAM米型的表是否存在错误。CHECK TABLE语句在执行过程中也会给表加上只读锁。

9、优化表

MySQL中使用 OPTIMIZE TABLE 语句来优化表。但是,OPTILMIZE TABLE语句只能优化表中的VARCHAR、 BLOB或TEXT类型的字段。一个表使用了这些字段的数据类型,若已经删除了表的一大部分数据,或者已经对含有可变长度行的表(含有VARCHAR、BLOB或TEXT列的表)进行了很多更新,则应使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片,在执行过程中也会给表加上只读锁。