升级硬件优化数据库设计优化索引优化查询
数据库性能调优是一个系统工程,不是一件容易的事情。对于集中式数据库的性能优化(有别于分布式数据库),大约可以从以下几个方面入手:
一、升级硬件
购买性能更高的服务器,或者升级机器硬件,包括CPU、内存、磁盘,以及加大带宽,提高网络传输速率。
加内存可以将更多的数据保存在缓冲区,以减少硬盘IO操作,从而提升数据库的整体性能。
磁盘子系统的性能提升体现在2个方面:
1)采用速度更快的磁盘系统,比如固态硬盘代替机械硬盘;或者采用SCSI接口硬盘
2)合理分配磁盘IO到多个设备,提高并行操作能力,比如磁盘阵列
以上就是所谓垂直扩展,集中式数据库的性能提升方式。如果是分布式数据库,则可以水平扩展,以增加服务器的数量来提升服务能力。
二、优化数据库设计
在数据库设计阶段,就可以着手考虑性能优化问题。数据库的设计优化,可以包括逻辑设计优化和物理设计优化。
1、逻辑设计优化
主要是适度反规范化。
数据库规范化程度提升,使得数据库冗余信息减少,但也引入了新的问题。由于规范化使得关系模式不断被拆解,在使用数据时需要频繁进行连接操作,而连接操作是最耗时的,是数据库性能的制约因素。因此,适度反规范化,合理增加冗余属性,可以改善系统性能。常用的措施如下:
1)增加派生列(计算列),将常用的计算属性(例如总和、最大值等)存储到数据库中
2)重新定义实体(即重新设计表),增加冗余列,以减少连接等操作
3)水平或垂直分割表,提升并行访问度
2、物理设计优化
1)属性的数据类型应该反映数据所需的最小存储空间,特别是对于建立索引的属性。比如,能够用smallint类型的,就不要用integer。这样索引可以更快被读取,而且一条记录的长度越小,每页返回的记录数量就越多,减少了IO操作,性能得以提升。
2)将一个大表分割,分别存放在不同的物理磁盘上,并发读取,减轻IO压力,提升读取速度。
3)数据库中文本或图像属性的数据存放在单独的物理设备上,原理同上。
三、优化索引策略
1、选用经常查询、且很少更新的属性建立索引。
2、使用最多索引重点进行优化
3、数据量非常小的表不必建立索引(主键除外),全表扫描更有效
4、一个表不要建立太多索引。索引过多会影响update、insert、delete性能。
四、优化查询
查询优化(SQL优化)也称为应用程序优化,是数据库优化最重要的一环。SQL优化的策略很多,如:
1、建立物化视图或尽可能减少多表查询
2、只检索需要的属性
3、用IN条件子句等价替换OR子句
4、事务晚开启,早关闭,经常commit,及早释放锁
5、非相干子查询代替相干子查询
非相干子查询在一条SQL语句中,是独立的子查询,不依赖于外部的查询,相干子查询相反。比如
1)非相干子查询
SElECT *
FROM Readers
WHERE 读者编号 IN
(
SELECT 读者编号
FROM [Borrow History]
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2)相干子查询
SELECT FROM Books As a
WHERE 价格 >
(
SELECT AVG(价格)
FROM Books AS b
WHERE a.类编号=b.类编号
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3)总结
非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
故非相关子查询比相关子查询效率高。