数据库优化之系统设计方面思考

转载 2013年11月15日 18:33:50
摘要:一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。

关于数据库优化方面的文章很多,但是有的写的似是而非,有的不切实际,对一个数据库来说,只能做到更优,不可能最优,并且由于实际需求不同,优化方案还是有所差异,根据实际需要关心的方面(速度、存储空间、可维护性、可拓展性)来优化数据库,而这些方面往往又是相互矛盾的,下面结合网上的一些看法和自己的一些观点做个总结。

  一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。

  一、 分析阶段

  一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等。最好能有各种需求的量化的指标。

  另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是OLTP(联机事务处理系统)和OLAP(联机分析处理系统)。

  二、 设计阶段

  设计阶段可以说是以后系统性能的关键阶段,在这个阶段,有一个关系到以后几乎所有性能调优的过程—数据库设计。

  在数据库设计完成后,可以进行初步的索引设计,好的索引设计可以指导编码阶段写出高效率的代码,为整个系统的性能打下良好的基础。

  以下是性能要求设计阶段需要注意的:

  1、数据库逻辑设计的规范化

  数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式:

  第1规范:没有重复的组或多值的列,这是数据库设计的最低要求。

第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分。消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。

  第3规范: 一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。

  更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三范式,系统会产生较少的列和较多的表,因而减少了数据冗余,也利于性能的提高。

  2、合理的冗余

  完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入冗余是必要的。

  冗余可以是冗余数据库、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。

  冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。

  3、主键的设计

  主键是必要的,SQL SERVER的主键同时是一个唯一索引,而且在实际应用中,我们往往选择最小的键组合作为主键,所以主键往往适合作为表的聚集索引。聚集索引对查询的影响是比较大的,这个在下面索引的叙述。

  在有多个键的表,主键的选择也比较重要,一般选择总的长度小的键,小的键的比较速度快,同时小的键可以使主键的B树结构的层次更少。

  主键的选择还要注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般应该选择重复率低、单独或者组合查询可能性大的字段放在前面。

  4、外键的设计

外键作为数据库对象,很多人认为麻烦而不用,实际上,外键在大部分情况下是很有用的,理由是:

  外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK约束、规则约束、触发器、客户端程序,一般认为,离数据越近的方法效率越高。

  谨慎使用级联删除和级联更新,级联删除和级联更新作为SQL SERVER 2000当年的新功能,在2005作了保留,应该有其可用之处。我这里说的谨慎,是因为级联删除和级联更新有些突破了传统的关于外键的定义,功能有点太过强大,使用前必须确定自己已经把握好其功能范围,否则,级联删除和级联更新可能让你的数据莫名其妙的被修改或者丢失。从性能看级联删除和级联更新是比其他方法更高效的方法。

  5、字段的设计

  字段是数据库最基本的单位,其设计对性能的影响是很大的。需要注意如下:

  A、数据类型尽量用数字型,数字型的比较比字符型的快很多。

  B、数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。

  C、 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。

  D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。

  E、自增字段要慎用,不利于数据迁移。

  6、数据库物理存储和环境的设计

  在设计阶段,可以对数据库的物理存储、操作系统环境、网络环境进行必要的设计,使得我们的系统在将来能适应比较多的用户并发和比较大的数据量。

  这里需要注意文件组的作用,适用文件组可以有效把I/O操作分散到不同的物理硬盘,提高并发能力。

  7、系统设计

  整个系统的设计特别是系统结构设计对性能是有很大影响的,对于一般的OLTP系统,可以选择C/S结构、三层的C/S结构等,不同的系统结构其性能的关键也有所不同。

系统设计阶段应该归纳一些业务逻辑放在数据库编程实现,数据库编程包括数据库存储过程、触发器和函数。用数据库编程实现业务逻辑的好处是减少网络流量并可更充分利用数据库的预编译和缓存功能。

  8、索引的设计

  在设计阶段,可以根据功能和性能的需求进行初步的索引设计,这里需要根据预计的数据量和查询来设计索引,可能与将来实际使用的时候会有所区别。

  关于索引的选择,应改主意:

  A、根据数据量决定哪些表需要增加索引,数据量小的可以只有主键。

  B、根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。

  C、把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。

  D、一个表不要加太多索引,因为索引影响插入和更新的速度。


转载于:http://kb.cnblogs.com/page/98467/

MySql数据库优化可以从哪几个方面进行?

数据库优化可以从哪几个方面进行?老司机来带你!
  • q602075961
  • q602075961
  • 2017年05月01日 23:44
  • 1510

SQL数据库优化方面的经验

1、用PreparedStatement一般来说比用Statement性能高,一个sql发给服务器去执行,涉及步骤:语法检查,语义分析,编译,缓存。 2、有外键约束会影响插入和删除性能,如果程序能够保...
  • daodaipsrensheng
  • daodaipsrensheng
  • 2016年08月29日 10:42
  • 5502

分布式系统设计之基础设施(一)

分布式系统设计之基础设施一个大型,稳健,成熟的分布式系统背后,是由很多系统共同支撑的,我们将这些支撑系统成为分布式系统的基础设施。分布式缓存简介 分布式缓存主要用于高并发环境下,减轻数据库的...
  • u012244265
  • u012244265
  • 2017年09月11日 08:52
  • 200

一些数据库优化方面的经验

用PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存 “inert into user values(1...
  • lixiaoming000
  • lixiaoming000
  • 2013年10月29日 15:29
  • 1181

PLC编程再思考之二:SOA

随着AMAZON云服务的成功,许多人知道了BEZOS在AMAZON内部推广WEB SERVICE的故事,从而佩服他的技术眼光和执行力。 如果说AMAZON.COM的成功是因为长尾理论,是对万货商店的技...
  • tallrain
  • tallrain
  • 2016年12月15日 19:19
  • 143

项目优化应该从那几个方面进行

首先一个项目的优化要从首页、数据库、等方面进行优化 前端: 1)压缩js/css文件,压缩文件,会将文件中的所有空格去掉,并且将复杂的变量名简单化。 2)在加载js/css文件时,我们需要将公共的js...
  • php_younger
  • php_younger
  • 2016年12月17日 10:25
  • 528

数据库优化:分库分表(sharding)

1.为什么需要分库分表? 数据库sharding可以分为两个部分,1是数据库的垂直切分,即分库,2是水平切分,即分表。简单的说,如果一个单点数据库的访问频率特别高,负载特别大的情况下,分库的优化能够分...
  • C_K_K
  • C_K_K
  • 2017年04月14日 11:48
  • 305

浅析android系统设计中的回调思想

为何写作本文  在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想。比如activity的生命周期,fragment的生命周期,皆是回调函数...
  • a910626
  • a910626
  • 2015年05月22日 20:06
  • 3012

系统设计思考

系统设计思考 发表于 2015 年 6 月 6 日 读了微信架构描述后的一点思考 模块拆分:设计大系统,一定要拆分子系统,模块,项目,做到各项目间相互独立。在较小的系统设计中一般将模块哈U分清晰即可了...
  • NJZhuJinhua
  • NJZhuJinhua
  • 2016年03月26日 22:22
  • 580

刘未鹏:如何清晰地思考(近一年来业余阅读的关于思维方面的知识结构整理)

一年前一个偶然的机会我遇到了一本书——《影响力》,看完这本书之后对我们如何思维产生了极大的兴趣,于是在一年的时间里面密集地阅读了以下一些方面的经典著作:社会心理学、认知科学、神经科学、进化心理学、行为...
  • synapse7
  • synapse7
  • 2013年08月19日 12:26
  • 1601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库优化之系统设计方面思考
举报原因:
原因补充:

(最多只允许输入30个字)