Spring JDBC Configuration
数据库设计调优
表设计
数据库表设计可以按照标准化或者非标准化设计(范式),每种方式有各自的优缺点。对于标准化字段结构,可以使数据库中的字段非常简洁,并且没有冗余的数据存储,但是这又带来另一个问题,就是在使用查询的时候,因为标准化的设计使得很多数据是在某些表中的,必须跨表查询,联结(join)查询带来的是查询效率的问题,所以比较好的方法就是这种标准化以及非标准化设计,对于某些字段,可以进行适当的冗余,以提高查询的效率。
- 表的垂直拆分
在垂直拆分表时,我们将一个大表中的字段拆分到不同的表中去,一般涉及到性能问题是大表中的某些字段比较长,比如是text或者blob类型的,最好单独拆分到另一个表中去存储,对于需要频繁使用的业务表,不应该存储比较大的字段影响性能。
一般在JPA/Hibernate这种orm框架中,对于这些单独的大字段,拆分表以后,可以对这些设置为lazily loaded懒加载模式(在一个新的表中,懒加载模式下,只有使用到该字段时才会去查询加载),可以明显的提升性能。 使用索引(indexing)
索引是提高查询效率的最好方式之一。- 为了最大化的利用索引,索引应该是where,order by或者group by条件语句中频繁使用的字段。
- 尽量使用整型(integer)类型的列作为索引。该类型占用空间比较小,所以I/O处理更快。(实际上很多索引一般都是字符串的)
- 聚合索引(clustered)索引一般是范围查询更好,非聚合索引通常单点查询效率更高。
需要注意的是,索引不是越多越好,因为索引是会占用额外的存储空间的,并且对于大字段(比较长的字段,比如很长的字符串,或者text这种数据格式)最好不要使用索引,对于需要频繁跟新的字段,尽量也不要设置为索引,因为更新后索引部分也需要进行相应的更新,这会影响数据库的性能。
使用正确的数据类型
正确的数据类型不仅能够节省数据占用的磁盘空间,并且还能一定程度的提高数据的查询效率。
例如,一个smallint数据占用2比特空间,但是一个int数据要占用4比特空间,如果smallint能存下的字段没有必要使用更大类型字段去存储。对于同样量的数据,更大的空间以为这数据库读取的时候需要读取更大的存储区域,一定程度上影响性能。
同时,正确的数据类型还可以帮助我们存储数据的正确性,比如int类型的字段当存入字符串或者日期类型时会失败。- 定义列限制条件(constraints)
列限制条件强制限制了数据或者数据类型可以在表中进行的插入、更新、删除操作。列限制的目的是保持对于数据的更新、删除、插入的完整。但是还是需要合理的使用,比如定义not null限制时不会影响太大,但是使用check限制条件时,就需要考虑一下性能影响了。