有关数据库性能优化

上一篇 / 下一篇  2010-10-18 16:22:17 / 个人分类:相关技术

一、索引
索引虽然可以提升查询的效率,但需要正确的使用索引,建立有价值的索引,避免使用冗余索引;注意最理想的情况是所有的索引都可以直接在内存中查找,而不需要访问磁盘;索引本身会占很多的磁盘空间,很多时候索引甚至比数据本身还要大,存储空间比计算时间要廉价的多,牺牲空间换取时间是值得的
二、锁定
我们可以认为查询的时间开销主要包括两部分,即查询本身所耗时间及查询开始前的等待时间,索引影响后者,锁定则影响前者,对锁优化的目标显然是减少等待时间。
合理正确使用数据库锁相关知识较多,后续跟进
三、缓存
访问内存比访问硬盘快得多,在接下来几年中,除非硬盘体系结构有重大改进,不然这一情况很可能会持续。缓存这一将数据存储于内存而非硬盘中的过程由此应运而生:用户从缓存而非数据库所驻留的磁盘中获取数据。在不考虑其它因素的情况下,从内存中读取数据要比从硬盘中读取数据快10000倍。这主要是内存与硬盘的速度差异所造成的。http://database.ctocio.com.cn/247/8883747.shtml
有关cache hit ratio:
 就是终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要回原服务器取,就是没有命中。取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时。
  命中率=命中数/(命中数+没有命中数)
  缓存命中率是判断加速效果好坏的重要因素之一
  影响缓存命中率的因素
  缓存的命中率取决于很多的因素:
  1、应用场景
  是OLTP还是OLAP应用,即使是OLTP,也要看访问的频度,一个极少被访问到的缓存等于没有什么效果。一般来说,互联网网站是非常适合缓存应用的场景。
  2、缓存的粒度
  毫无疑问,缓存的粒度越小,命中率就越高,对象缓存是目前缓存粒度最小的,因此被命中的几率更高。举个例子来说吧:你访问当前这个页面,浏览帖子,那么对于ORM来说,需要发送n条SQL,取各自帖子user的对象。很显然,如果这个user在其他帖子里面也跟贴了,那么在访问那个帖子的时候,就可以直接从缓存里面取这个user对象了。
  3、架构的设计
  架构的设计对于缓存命中率也有至关重要的影响。例如你应该如何去尽量避免缓存失效的问题,如何尽量提供频繁访问数据的缓存问题,这些都是考验架构师水平的地方。再举个例子来说,对于论坛,需要记录每个topic的浏览次数,所以每次有人访问这个topic,那么topic表就要update一次,这意味着什么呢?对于topic的对象缓存是无效的,每次访问都要更新缓存。那么可以想一些办法,例如增加一个中间变量记录点击次数,每累计一定的点击,才更新一次数据库,从而减低缓存失效的频率。
  4、缓存的容量和缓存的有效期
  缓存太小,造成频繁的LRU,也会降低命中率,缓存的有效期太短也会造成缓存命中率下降。
  所以缓存命中率问题不能一概而论,一定说命中率很低或者命中率很高。但是如果你对于缓存的掌握很精通,有意识的去调整应用的架构,去分解缓存的粒度,总是会带来很高的命中率的。
四、数据库连接池
连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、治理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。简单理解:牺牲资源换时间,找大合适的连接数需要反复验证。
 

TAG:

 

评分:0

我来说两句

Open Toolbar