数据库性能优化的方法(网站数据库性能优化方法)
如今,互联网上有许多关于数据库优化的文章,但有些文章似乎不现实,有些不现实。对于一个数据库来说,它只能做得更好,不可能做得更好。此外,由于实际需求不同,优化方案仍然不同。根据实际需要关注的方面(速度、存储空间、可维护性和可扩展性),优化数据库往往是相互矛盾的。
系统性能的提高不仅是试运行或维护阶段的性能调整,也是开发阶段的事情,整个软件生命周期都需要注意。因此,我根据软件生命周期的不同阶段总结了与数据库性能优化相关的方法和注意事项。
为什么要对数据库进行优化?
数据库的应用优化通常可以分为两个方面:源代码和SQL句子。
由于程序逻辑的变化,源代码的优化在时间成本和风险上成本高,数据库系统性能的提高效率有限,为什么要优化SQL语句?
1.SQL句子是操作数据库的唯一途径,对数据库系统的性能起着决定性的作用。
2.SQL句子消耗70%-90%的数据库资源。
3.SQL句独立于程序设计逻辑,优化SQL句不会影响程序逻辑。
4.SQL句子写法不同,性能差异很大。
SQL语句容易学,但很难掌握。
优化SQL句子的传统方法是手工重写SQL句子。DBA或高级程序员通过分析SQL句子执行计划,依靠经验,尝试重写SQL句子,然后比较结果和性能,试图找到性能更好的SQL句子。
这种传统的做法找不到SQL语句的所有可能写法,依赖于人的经验,非常费时。
第二,分析阶段。
一般而言,在系统分析阶段需要注意的地方很多,系统的各种功能性、可用性、可靠性、安全性的需求引起了我们的大部分注意。
但林云必须提醒大家要注意的是,性能是非常重要的非功能性需求,必须根据系统的特点来确定其实时性需求,响应时间需求,硬件配置等等,最好有各种量化的需求指标。
另一方面,在分析阶段,系统的类型应该根据不同的需求来区分。大的方面是OLTP(在线事务处理系统)和OLAP(在线分析处理系统)。
第三,设计阶段。
设计阶段可以说是未来系统性能的关键阶段。在这个阶段,有一个关系到未来几乎所有性能优化的过程——数据库设计。
数据库设计完成后,可以进行初步的索引设计,一个好的索引设计可以指导编码阶段写出高效的代码,为整个系统的性能奠定良好的基础。
在性能要求设计阶段,应注意以下几点:
1.标准化数据库逻辑设计。
数据库逻辑设计的标准化是我们通常所说的范式,我们可以这样简单地理解范式:
第一条规无重复组或多值列,这是数据库设计的最低要求。
规范二:每一个非关键字段都必须依赖于主要关键字,不能依赖于组合式主要关键字的某些组成部分,消除部分依赖,大多数情况下,数据库设计应达到第二个标准。
第三条规范:一个非关键字段不能依赖另一个非关键字段。消除传输依赖,达到第三范式应该是系统中大多数表格的要求,除非有一些特殊功能的表格。
在林云看来,如果全部达到第二范式,大多数达到第三范式,系统就会产生较少的列和较多的表格,从而减少数据冗余,也有利于性能的提高。
二是合理冗余。
完全按照标准化设计的系统几乎是不可能的,除非系统特别小,否则在标准化设计设计后有计划地添加冗余。
冗余可以是冗余数据库、冗余表或冗余字段,不同粒度的冗余可以起到不同的作用。
冗余可以是为了方便编程,也可以是为了提高性能。
从性能的角度来看,冗馀数据库可以分散数据库压力,冗馀表可以分散数据量大的表的并发压力,加快特殊查询速度,冗馀字段可以有效减少数据库表的连接,提高效率。
三是主键设计。
主键是必要的。SQLSERVER的主键是唯一的索引。在实际应用中,我们经常选择最小的键组合作为主键,所以主键往往适合作为表格的聚集索引。聚集索引对查询有很大影响。这是下面索引的描述。
在有多个键的表中,主键的选择也很重要,一般选择总长度小的键,小的键比较快,同时小的键可以减少主键b树结构的水平。
主键的选择还应注意组合主键的字段顺序。对于组合主键,不同字段顺序的主键性能差异可能很大。一般来说,重复率低、单独或组合查询可能性高的字段应放在前面。
四是外键设计。
外键作为数据库的对象,很多人认为麻烦而不使用。事实上,外键在大多数情况下非常有用。原因是:
外键是最有效的一致性维护方法。数据库的一致性要求可以依次使用外键、CHECK约束、规则约束、触发器和客户端程序。一般来说,离数据越近,效率越高。
谨慎使用关联删除和关联更新。关联删除和关联更新作为SQLSERVER2000年的新功能,保留在2005年,应该有它的可用性。
林云这里所说的谨慎,是因为级联删除和级联更新有些突破了传统对外键的定义,功能有点过于强大,在使用之前一定要确定自己已经掌握了它的功能范围,否则,级联删除和级联更新会让你的数据莫名地被修改或丢失。
就性能而言,级联删除和更新比其它方法更有效。
五是字段设计。
字段是数据库最基本的单位,其设计对性能有很大影响。为此,林云提醒大家注意以下几点:
数据类型尽量采用数字型,数字型的比较要快很多。
数据类型尽可能小,这里的数据类型尽可能小,是指在满足可预见未来需求的前提下。
尽量不要允许NULL,除非有必要,否则可以用NOTNULL+DEFAULT代替。
少用TEXT和IMAGE,二进制字段读写速度较慢,读写方法也不多,大多数情况下最好不要用。
自增字段应慎用,不利于数据迁移。
6.数据库的物理存储和环境设计。
在设计阶段,可以对数据库的物理存储、操作系统环境和网络环境进行必要的设计,使我们的系统在未来能够适应更多的用户并发和更大的数据量。
在此要注意文件组的作用,适用文件组能有效地将I/O操作分散到不同的物理硬盘上,提高并发性。
七是系统设计。
整个系统的设计,尤其是系统结构设计,对性能影响很大。对于普通OLTP系统,可以选择C/S结构和三层C/S结构。不同的系统结构有不同的关键性。
在系统设计阶段,应将一些业务逻辑归纳为数据库编程实现,包括数据库存储过程、触发器和函数,利用数据库编程实现业务逻辑的优点是减少网络流量,更好地利用数据库的预编译和缓存功能。
八是索引设计。
在设计阶段,索引可以根据功能和性能的需要进行初步的设计。索引可能不同于未来实际使用时的预期数据量和查询。
关于索引的选择,林云提醒大家注意以下几点:
a、根据数据量决定哪个表需要增加索引,数据量少的只有主键。
根据使用频率决定哪些字段需要建立索引,选择经常作为连接、筛选、聚合查询、排序的字段作为索引的候选字段。
将经常出现在一起的字段组合起来,形成组合索引,组合索引的字段顺序与主键相同,还需要将最常用的字段放在前面,并将重复率低的字段放在前面。
一个表格不能添加太多的索引,因为索引会影响插入和更新的速度。
林云博客评论:
数据库系统的生命周期可分为三个阶段:设计、开发和成品。在设计阶段,优化数据库性能的成本最低,效益最大。在成品阶段,优化数据库性能的成本最高,效益最小。
原创文章:《数据库性能优化的方法(网站数据库性能优化方法)》,作者:林云SEO,如若转载,请注明原文及出处:https://www.tang-seo.com/6565.html