论数据库访问中的查询优化

2017-06-15 12:16李启华
科教导刊·电子版 2017年11期
关键词:效率

李启华

摘 要 本文讲述了在日常的数据库应用开发中如何对查询语句进行优化以达到改进程序执行效率的目的,文中列举7种最常用的优化规则以及附测试环境中的执行耗时数据比较,印证几条优化规则的有效性。

关键词 SQL 查询优化 查询语句 效率

中图分类号:TP311 文献标识码:A

0引言

小关是我大学时期的师弟,有一天他打电话给我告诉我他自己写的一个数据库应用程序刚开始投产时运行很流畅,但在使用一段时间后却变得很慢,客户进行了投诉,他检查过客户的机器并没有中病毒,机器系统资源充足而且程序也没有什么问题,他想了很久也找不到解决办法。我了解到出问题的程序是一个仓库管理程序,客户每天都需要导入大量的数据到系统中并经常要进行一些数据查询的操作,根据这些情况q 一下子便想到了问题所在--随着应用系统数据量增多而逐渐突显出来的数据查询效率问题。

1问题产生的原因

数据库查询的效率问题是在应用开发中最容易被忽略的部分,由于应用程序开发时期系统测试数据库库数据量往往较少,查询结果的返回时间往往较短,不容易凸显出因数据查询效率而导致的程序运行过慢的问题。但是当应用程序投产使用后随着数据库数据量的日益增多,数据查询的耗时将会呈几何级的增长,这样将大大影响程序的运行速度,成为程序中的一大瓶颈。

2解决问题的办法

同一查询结果的数据库查询语句写法千百,但各语句的执行效率却不同,在坏的查询语句耗费掉几分钟的查询时间的同时好的查询语句却只需要几十秒的查询时间,所以在进行应用程序开发的时候是有必要进行数据查询语句的优化,以保证程序的持续运行效率。

3查询优化的几种常用规则

以下是我在日常应用程序开发中总结出来的最常用的几条优化规则,并附部分本人亲自在数据库环境下测试耗时数据,供大家参考:

(1)在查询语句中避免使用“select *”语句,只返回必要的结果项,去除不必要的结果项。在查询语句中应只返回必要的结果项,如在一个应用中只需要数据表中的field1及field2字段,则在查询语句应写成“select field1,field2”,另外“select *”这种懒惰的写法应该摒弃掉。在一个数据量为50万,数据项为20的数据表中使用“select *”写法查询耗时为6500毫秒,而使用“select field1”只查询其中的一项的查询耗时为900毫秒,后者比前者缩短了6倍多。

(2) 在查询语句的搜索条件中将最具限制性的条件放在最前面,尽量在最前面的搜索条件中减少搜索得到的结果,例如在一个含有日期的数据表中要搜索“1995-01-01”到“2013-05-31”日期内的数据,而数据表中的日期记录大多在2013年到2016年之间,那么将“dateField<='2013-05-31'”条件放在“dateField>='1995-01-01'”条件之前会大大缩短搜索的时长。因为查询应用执行查询语句时是按由左至右的顺序执行的,前面的查询条件若可大量减少搜索得的结果将大大减少后面查询条件的搜索量,从而缩短查询时间。

(3) 查询条件的排列顺序应该应该与索引字段的顺序尽量保持一致,例如表table1中的索引字段按顺序为field1、field2、field3,那么在搜索條件中若出现两个以上索引字段,则搜索条件应按索引顺序由左至右排列,可以大大地增强查询的效率。因为数据表在建立索引时表里的数据也是按索引的排列顺序排列的,查询条件按索引字段顺序排列可让数据库引擎更快地找到所需的数据。

(4)在查询条件中尽量使用“>=”和“<=”运算符来代替“>”和“<”运算符,例如在一个含有日期的数据表中要搜索日期大于2015-01-01的数据,则使用查询条件“dateField>='1995-01-02'”要比查询条件“dateField>'1995-01-01'”耗时要短,因为“>=” 和“<=”运算符可以快速地定位索引。在一个数据量为50万的数据表中使用“>”运算符查询耗时为100毫秒,而使用“>=”运算符查询耗时为75毫秒,后者比前者耗时缩短了25%。

(5)查询条件中尽量不要使用函数,例如你在一个带交易金额的数据表中要查询交易金额除以4后等于50的数据,那么直观的查询条件为“amountField/4=50”,但是这种查询条件非常的耗时,因为它会导致查询程序不使用索引,此时你应该机智地转换一下写法,将查询条件改为“amountField=200”,这样将大大缩短查询的时间。在一个数据量为130万的数据表中使用“/”函数查询耗时为840毫秒,而经转换后直接使用“=”运算符查询耗时为78毫秒,后者比前者耗时缩短了66%。

(6)查询条件中若需要使用like运算符应尽量避免在查询关键字前使用通配符“%”,例如你需要在一个含有卡片号的数据表中查询含有“13654””的所有记录,你可能会直观地使用“cardNoField like '%13654%'”这种表达式,但这种表达式中的第一个通配符会令搜索程序不使用索引,从而降低查询效率,如果你对数据表中的数据进行分析后可以确认“13654”只出现在字段的开头,那么使用“cardNoField like '13654%' ”这种表达式将大大提升效率。在一个数据量为50万的数据表中使用“like '%data%'”表达式查询耗时为4200毫秒,而若使用“like 'data%'”表达式查询耗时为3900毫秒,后者比前者耗时缩短了7%。

(7)在往数据表插入数据时,尽量不要插入空值(NULL)到字段中,应该插入一个约定的默认值,因为空值(NULL)在数据表中不存储到索引中,这样若需要查询出这些空值的数据时将大大增加查询的耗时。在一个数据量为10万的数据表需要查询出所有“field1 is null”的数据耗时为1150毫秒,而将这些null的数据改为一个约定的默认值后再查询出这个默认值的记录耗时为1040,后者比前者耗时缩短了10%。

4结语

以上便是我对数据库查询优化的几个归纳及建议,希望能对大家的应用开发提供参考及帮助,同时亦欢迎大家对我文章中存在的问题及不足提出建议及指正。

参考文献

[1] 魏银珍,陈征兵.SQL Server数据库的查询优化策略研究[J].电脑知识与技术,2011,07(29).

猜你喜欢
效率
注意实验拓展,提高复习效率
跟踪导练(一)2
“钱”、“事”脱节效率低
提高讲解示范效率的几点感受