在数据库设计的过程中,我们经常会遇到比如:是否所有的设计都应该遵循数据库设计的第三范式,字段的长度的到底定义为多少才算合适等问题。这些问题虽然看起来比较小,但是设计不当就会给我们的系统应用带来很多的问题。本节主要介绍一些常用的数据库对象的优化方法,来解决我们在设计过程中所面临的问题。
优化表的数据类型
在 MySQL 数据库中提供了关于表的字段的优化和建议的函数,来让我们方便地得到数据库给出的优化建议。我们再来根据实际应用的情况考虑是否要采用优化建议,使用如下的 SQL 语句:
SELECT * FROM tableName PROCEEDURE ANALYSE();
我们来进行分步举例说明。
1. 创建一个数据表
CREATE TABLE demo_table(
cust_num MEDIUMINT AUTO_INCREMENT, -- 编号
cust_name VARCHAR(20) NOT NULL, --名称
cust_city VARCHAR(10) NOT NULL, --城市
PRIMARY KEY(cust_num), --主键
);
2. 在创建的数据库表中生成一些测试数据
3. 使用 PROCEDURE ANALYSE() 函数确定需要优化的列
SELECT * FROM demo_table PROCEDURE ANALYSE();
4. 根据应用需求选择需要修复和优化的数据列
ALTER TABLE demo_table MODIFY cust_name VARCHAR(10);
拆分数据表提高数据库访问效率
一般情况下,对于数据库的拆分有两种方式,一种是水平拆分,另外一种则是垂直拆分。所谓水平拆分,根据一列或者多列的值将数据行放到两个独立的数据表中。垂直拆分则是将主码和一些常用的列放到一个表中,再将主码和剩余的列放到另外的一张数据表中。
例如:我们将 2019 年 1 月的淘宝账单存在一张数据表中,再将的数据量存放到另外一张表中。以每个月的时间节点来存放数据,这种方式就是水平分表。当然,这种方式会增加数据查询的复杂性,所以在实际应用中我们需要考虑数据的增长速度再来决定我们的业务是否需要分表处理数据。
递归范化
一般情况下,数据库设计需要满足规范化。但是并不是数据库设计的规范程度越高数据库的性能就是越好。因为数据库的设计的规范化越高,那么数据库的表与表之间的关系就越是复杂。所以,我们在设计数据库时就需要考虑使用逆规范化设计数据库来提升数据库的性能。
逆规范化一般使用的技术主要是:增加冗余列、增加派生列、重新组表、分割表。
- 增加冗余列就是在多个表中具有相同的列,这样就可以在开发人员进行 SQL 查询时减少表与表之间的连接操作。
- 增加派生列就是在表中增加的列来自于其他数据表的数据,列的数据由其他表中的数据计算生成,这种操作也是为了减少表与表之间的连接查询,提高查询速度。
- 重新租表则指的是将两个经常使用两个连接查询的数据表组合成一个数据表,当然也是为了减少表的连接查询。
- 至于分割表就是上面提到的表的拆分。
使用中间表提升统计查询的速度
加入中间表主要有以下两个优点:
- 一是可以做到与数据原表隔离,在中间表上做数据查询不会影响在线应用。
- 二是可以灵活的增加临时使用的新字段,从而可以提高查询统计的数据效率。