如今,互联网上关于数据库优化方面的文章很多,但是有的写的似是而非,有的不切实际,对一个数据库来说,只能做到更优,不可能最优,并且由于实际需求不同,优化方案还是有所差异的,根据实际需要关心的方面(速度、存储空间、可维护性、可拓展性)来优化数据库,而这些方面往往又是相互矛盾的。 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,所以,我按照软件生命周期的不同阶段来总结数据库性能优化相关的方法及注意事项。
一、为什么要优化数据库?
数据库的应用程序优化通常可分为两个方面:源代码和SQL语句。
由于涉及到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系统性能的提升收效有限,那么,我们为什么要优化SQL语句呢?
1、SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定性的作用。
2、SQL语句消耗了70%至90%的数据库资源。
3、SQL语句独立于程序设计逻辑,对SQL语句进行优化不会影响程序逻辑。
4、SQL语句有不同的写法,在性能上的差异非常大。
5、SQL语句易学,但难精通。
优化SQL语句的传统方法是通过手工重写来对SQL语句进行优化,DBA或资深程序员通过对SQL语句执行计划的分析,依靠经验,尝试重写SQL语句,然后对结果和性能进行比较,以试图找到性能较佳的SQL语句。
这种传统上的作法无法找出SQL语句的所有可能写法,且依赖于人的经验,非常耗费时间。
二、分析阶段
一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力。
但是,马海祥必须提醒大家要注意一点,性能是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等,最好能有各种需求的量化的指标。
另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是OLTP(联机事务处理系统)和OLAP(联机分析处理系统)。
三、设计阶段
设计阶段可以说是以后系统性能的关键阶段,在这个阶段,有一个关系到以后几乎所有性能调优的过程—数据库设计。
在数据库设计完成后,可以进行初步的索引设计,好的索引设计可以指导编码阶段写出高效率的代码,为整个系统的性能打下良好的基础。