如何提高数据库性能,减少数据库服务器压力瓶颈一两个小方法
2011-06-24 09:35
603 查看
树立的观念:一个SQL语句,如果在压力测试时CPU占有率达到100%,此语句肯定存在问题。
在大多数程序员的心里,一直认为数据库加索引,在查询中使用索引,就可以提高数据库性能。其实这种观点有一点的局限性,如果不好好的利用已经建立好的数据库索引,有时反倒给数据库增加更大的处理压力。现在我们举例说明一下:
在现有的个人信息管理系统登录处的查询中,有这么一个SQL语句:
Select StudentInfoID, StudentNumber, StudentName,UnifyExamInfoID,NetSchoolID from StudentInfo
where StudentCrtificateNumber ='130425831217494' and rtrim(ltrim(StudentNumber)) = 'D0462382001'
此SQL语句的目的是查找这个考生是否存在,验证登录的效果,就是这么一个简单的SQL语句,在压力测试时,10个用户同时登录,就会造成数据库服务器(2CPU,4G内存,IBM专用服务器)CPU占有率达到100%。而这张表也建立了StudentCrtificateNumber 和 StudentNumber 两个字段的索引, 问题出在哪呢?原因如下:
(1)在studentinfo表中,建立了一个索引LX_STUDENTINFO,包括了四个字段,顺序为:studycenternumber,studentnumber,studentname,studentcrtificatenumber。
(2)程序员理解的是,这个索引中包括了这两个字段,那么查询时就应该很快。实际不是。
大家注意一点,这个LX_STUDENTINFO索引,是四个索引字段,而他们的顺序studycenternumber,studentnumber,studentname,studentcrtificatenumber,在数据库设计中,如果查询采用的第一个字段和第二个字段组合,则该索引有效;如果查询采用第一个、第二个和第三个字段组合,该索引也有效;而如果第一个和第三个,或第四个组合,则该索引是无效的,等同的效果仍是在没有索引的数据库中进行查询。也就是说建立的索引中的字段,在查询使用时,不能隔字段使用。
另外,索引中涉及到字段的顺序也会影响查询的性能,如果一个索引包含两个字段A1和A2,那么在查询时,一定要严格按索引中这两个字段的顺序设计查询,比如:select * from a where A1='A' and A2='B'。而如果程序员写成了select * from a where A2='B' and A1='A'的话,虽然不影响程序正常使用,但会增加数据库的压力,并且查询效能会降低。
根据这种思路,重新调整了一下这个表的索引,在这个表中增加了一个新的索引,只包括这两个字段,并且按StudentCrtificateNumber 和StudentNumber先后顺序排序。经过300人同时登录的压力测试,CPU占有率才只占2-3%,证明调整结果有效。
转自:http://www.cnitblog.com/liangchao/archive/2006/07/31/14482.html
在大多数程序员的心里,一直认为数据库加索引,在查询中使用索引,就可以提高数据库性能。其实这种观点有一点的局限性,如果不好好的利用已经建立好的数据库索引,有时反倒给数据库增加更大的处理压力。现在我们举例说明一下:
在现有的个人信息管理系统登录处的查询中,有这么一个SQL语句:
Select StudentInfoID, StudentNumber, StudentName,UnifyExamInfoID,NetSchoolID from StudentInfo
where StudentCrtificateNumber ='130425831217494' and rtrim(ltrim(StudentNumber)) = 'D0462382001'
此SQL语句的目的是查找这个考生是否存在,验证登录的效果,就是这么一个简单的SQL语句,在压力测试时,10个用户同时登录,就会造成数据库服务器(2CPU,4G内存,IBM专用服务器)CPU占有率达到100%。而这张表也建立了StudentCrtificateNumber 和 StudentNumber 两个字段的索引, 问题出在哪呢?原因如下:
(1)在studentinfo表中,建立了一个索引LX_STUDENTINFO,包括了四个字段,顺序为:studycenternumber,studentnumber,studentname,studentcrtificatenumber。
(2)程序员理解的是,这个索引中包括了这两个字段,那么查询时就应该很快。实际不是。
大家注意一点,这个LX_STUDENTINFO索引,是四个索引字段,而他们的顺序studycenternumber,studentnumber,studentname,studentcrtificatenumber,在数据库设计中,如果查询采用的第一个字段和第二个字段组合,则该索引有效;如果查询采用第一个、第二个和第三个字段组合,该索引也有效;而如果第一个和第三个,或第四个组合,则该索引是无效的,等同的效果仍是在没有索引的数据库中进行查询。也就是说建立的索引中的字段,在查询使用时,不能隔字段使用。
另外,索引中涉及到字段的顺序也会影响查询的性能,如果一个索引包含两个字段A1和A2,那么在查询时,一定要严格按索引中这两个字段的顺序设计查询,比如:select * from a where A1='A' and A2='B'。而如果程序员写成了select * from a where A2='B' and A1='A'的话,虽然不影响程序正常使用,但会增加数据库的压力,并且查询效能会降低。
根据这种思路,重新调整了一下这个表的索引,在这个表中增加了一个新的索引,只包括这两个字段,并且按StudentCrtificateNumber 和StudentNumber先后顺序排序。经过300人同时登录的压力测试,CPU占有率才只占2-3%,证明调整结果有效。
转自:http://www.cnitblog.com/liangchao/archive/2006/07/31/14482.html
相关文章推荐
- 如何提高数据库性能,减少数据库服务器压力瓶颈一两个小方法
- 如何提高数据库性能,减少数据库服务器压力瓶颈一两个小方法
- 如何提高数据库性能
- [转]详细讲解提高数据库查询效率的实用方法、外键关于性能
- 如何提高数据库访问性能
- 详细讲解提高数据库查询效率的实用方法、外键关于性能
- 如何提高网站的性能---方法1
- Win7系统中如何调节视觉效果从而提高性能的方法介绍
- 详细讲解提高数据库查询效率的实用方法、外键关于性能【转】
- 提高数据库性能的方法(sql)
- win7系统如何提升显卡性能?win7系统提高电脑显卡性能的方法
- [转]详细讲解提高数据库查询效率的实用方法、外键关于性能
- 数据库性能提高方法1--SET NOCOUNT的用法和注意事项
- [转]详细讲解提高数据库查询效率的实用方法、外键关于性能
- 如何提高WordPress访问速度与性能的四大方法
- 提高数据库访问性能的几种方法
- 探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法。
- 详细讲解提高数据库查询效率的实用方法、外键关于性能
- [转]详细讲解提高数据库查询效率的实用方法、外键关于性能
- 如何提高Web应用程序性能,写出五种方法