数据库优化是多方面的,原则是减少系统的瓶颈和资源的占用,增加系统的反应速度。如:通过优化文件系统,提高磁盘的I/O读写速度。通过优化表结构、增加索引、优化查询语句是系统响应速度更快。
PostgreSQL性能优化主要包括查询速度优化、更新速度优化、数据库结构优化。
- 查询优化
查询是数据库中最频繁的操作,优化查询语句可以有效提高数据库的性能。
- 使用explain语句分析语句的执行计划,查看索引使用情况
explain analyze select * from test_table1 where name='bruce.wu' - 查看第一步的分析结果,在查询条件使用的列上创建索引
- 优化子查询
子查询很灵活可以极大的节省查询的步骤,但是子查询的执行效率不高。执行子查询时数据库需要为内部嵌套的语句查询的结果建立一个临时表,然后再使用临时表中的数据进行查询。查询完成后再删除这个临时表,所以子查询的速度会慢一点。
我们可以使用join语句来替换掉子查询,来提高效率。join语句不需要建立临时表,所以其查询速度会优于子查询。大部分的不是很复杂的子查询都可以替换成join语句。
如:
select * from a1 where a1.id in (select b1.a1_id from b1)
select a1.* from a1 inner join b1 on a1.id=b1.a1_id
上面两句是等效的,但是inner join 语句效率更高
- 优化数据库结构
- 将字段很多的表分解成多个表
对于字段很多的表,如果有些字段在查询结果中的不常用到,可以将这些字段分离出来形成新的表。因为一个表的数据量很大时,查询会优于使用频率低的字段存在而变慢。 - 增加中间表
对于经常联合查询的表,可以建立一个中间表,把需要经常联合查询的数据插入到中间表,然后将联合查询改为对中间表的查询,来提高查询速度。 - 增加冗余字段
在设计数据库时应尽量遵循数据库设计范式,减少冗余字段,但是合理的冗余字段可以减少不必要的表关联查询,所以,适当的增加冗余字段也是可以提高查询效率的。
- 优化插入记录的速度
插入记录时,影响速度的主要是索引、唯一性校验、一次性插入条数等。根据这些情况分别优化
- 插入大量数据时先删除索引,完成后再重新创建索引
- 使用批量插入一条insert into 语句可以插入多条数据
- 禁止自动提交
如果允许每个插入都独立的提交,那么数据库就要为每行记录做大量的处理。所以在插入大量数据前禁止自动事务的自动提交,完成后再恢复自动提交。 - 使用copy语句批量导入
copy语句导入数据的速度要比insert语句快。在大量装载数据的情况下,导致的负载也少很多。