数据库查询优化浅析

时间:2022-10-12 04:52:43

数据库查询优化浅析

摘 要:在飞速发展的信息化时代,随着计算机技术的普及,数据库成了一种非常重要的信息存储工具。在以数据库为核心的应用系统中,查询操作最为频繁,而实现快速有效的查询对数据库的性能有直接的影响,为了提高数据库系统的性能,就需要对查询进行优化,而本文主要探讨了在实际应用中数据库查询优化的若干策略。

关键词:关系型数据库;查询优化;SQL

中图分类号:TP311.13

众所周知,数据库系统是管理信息系统的核心,伴随着数据库技术越来越成熟,数据库成为了现代计算机信息系统和计算机应用系统的基础乃至核心。从数据库的各种操作的统计中可以得知,查询操作所占的比重是最大的,而select语句在所有的SQL语句中代价最大。如果在查询过程使用合理的查询策略,就能够大大降低查询时间,提高查询效率,从而提升整个数据库系统的性能。由此可见,查询优化在数据库中的重要性。

1 合理的使用索引

索引的概念:索引是对数据库表中一个或多个字段的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定数据。数据库索引就好比一本书的目录,能加快数据库的查询速度,索引又分为聚簇索引和非聚簇索引,聚簇索引是按照数据存放的物理位置为顺序,而非聚簇索引则不是。聚簇索引能提高多行检索的速度,非聚簇索引对单行检索很快。

索引的使用原则:(1)在频繁建立连接,但是没有指定为外键的字段上使用索引。在连接次数较少的字段上由优化器自动生成索引;(2)避免在条件表达式中频繁用到的不同值较少的字段上建立索引,反之在不同值较多的字段中应该优先考虑建立索引;(3)在经常性的进行分组(group by or order by)或排序的属性上使用索引;(4)如果有多个字段需要排序,则可以使用复合索引。

2 避免或简化排序

不合理的排序对数据库查询的性能影响很大,特别是在数据量很大的情况下,这种影响愈加明显。所以对于大型表而言,我们应该尽量避免或者简化重复的排序。当利用索引自动的以适当的次序产生输出时,则优化器可以避免适当的步骤。

3 消除对大型表记录的顺序存取

在嵌套语句中,表的顺序存取对查询效率可能会产生相当大的影响。比如采取了顺序存取策略,在一个有两层嵌套的查询语句中,若每层都有10000行,那么查询需要执行1亿行数据,对于数据库而言,这是相当繁重的任务,为了避免这种情况,可以对连接的字段建立索引。

4 避免相关子查询

子查询的效率一般没有连接查询高,应该尽量用连接查询来代替子查询。除非必要,一般不要写有子查询的语句,如果必须用子查询的时候,在子查询里写尽量多条件,使得子查询返回的行数尽量少。

5 操作符的正确使用

在SQL语句中每一个操作符都有其特定的用处,应该尽量使用运算开销较小的运算符。(1)union和union all的使用。Union和union all都有合并数据集的功能,但如果仔细考虑就会发现,union在合并数据集时,会把相同的记录合并,而union all没有此功能,所以相对而言union all的开销较小,在两个数据集没有相同记录时用union all比union效率要高;(2)避免使用in关键字,因为in关键字的开销较大。

6 避免困难的正则表达式

有些关键字如matches和like都支持通配符匹配正则表达式。但这种匹配相当耗时。例如:selcet*from student where id like“20124407---”即使在id字段上建立索引,此种情况下依然采用顺序扫描方式。如果把语句改成selcet*from student where id>“20124407”,在执行查询时用索引来查询,明显会大大提高效率。

7 使用本地表

本地表是指把远程数据库中的相关数据下载到本地小型数据库中(如access、paradox),以克服网络通讯带来的障碍。但是本地表也有缺点:首先,在客户端上必须要配置一个数据库,这为客户造成了不必要的麻烦;第二,本地表的使用,使得不同的用户看到的信息不一致;第三,本地表无法保证实施性,数据库中的改变要重新下载之后,才能在本地表中生效。所以只能在权限管理这样的特殊场合才能使用。

8 使用临时表加速查询

将某一张表的子集进行排序并创建临时表,可以大大提高查询效率。如果一个查询要被执行多次而不止一次,可以把查询的结果找出来放在一张临时表中,并按查询要求进行排序。因为临时表中的记录肯定少于主表中的元组,物理顺序就是所要求的顺序,减少了I/O操作的数量,还有助于避免多重排序,而且在其他方面还能简化优化器的工作。从而提高了查询的效率。如:select

Student.name,pay.balance,…other columns from student,pay where student.student_id=pay.Student_id and pay.balance>0 and student.sutdent_id>“201044070101”order by student.name。

若查询被执行多次,能将所有未交学费的学生都一一查找出来,都放在一个临时表中,并以学生姓名进行排序。

Select Student.name,pay.balance,…other columns from student,pay where student.student_id=pay.Student_id and pay.balance>0 order by student.student_id into temp student_with_banance。然后使用以下方式进行查询:select* from student_with_balance where sutdent_id>“201 244070101”。注意:临时表无法显示主表的数据修改情况,如果主表中的修改比较频繁,就一定要注意不要丢失数据。

9 用排序来取代非顺序存取

非顺序磁盘存取是最慢的操作,因为磁盘存取臂的来回机械移动大大增加了存取时间,这种机械运动付出的时间代价是根本无法避免的。而SQL语句中,这种现象被很好的隐藏了,所以我们无法察觉。这样的结果导致,如果进行大量的非顺序页的查询,就一定会降低查询的速度,对于这种状况目前没有合适的解决方案,而只能通过数据库的排序来替代非顺序存取。

10 使用存储过程

把常用的查询语句编写成存储过程,以此来取代应用程序中的查询语句,可以极大的增强SQL语句的效率。具体如下:(1)减少网络流量和响应时间,提升应用程序的性能。若通过网络发送一个存储过程,而不是几百行查询语句,这样占有的资源更少,而每次发送SQL语句时,都会进行解析SQL语句、估算索引和利用率、绑定变量等一系列的工作;(2)客户端的请求效率更高;(3)存储过程执行计划能够重用,驻留在数据库内存的缓存里,减少了服务器开销;(4)客户端执行请求更有效率;(5)存储过程帮助提供代码重用;(6)存储过程能封装逻辑,你能够改变存储过程代码而不影响(假定你保持参数相同也不移除任何结果集的字段)。

11 结束语

对于关系型数据库的优化,一定要认清某些操作可能带来的时间成本。还要从多方面入手,抓住问题的本质,提出具体方案来改善数据库的查询效率。只有这样才可以真正意义上提高数据库系统的性能。

参考文献:

[1]王珊,孟小峰.数据库系统导论(第七版)[M].北京:机械工业出版社,2000.

[2]Abnhrmx Silbersehaa.数据库系统概念[M].北京:机械工业出版社,2006.

作者单位:长沙理工大学 经济与管理学院,长沙 410114

上一篇:基于LabVIEW的大数据处理技术研究 下一篇:网吧上网人员伴随分析与算法改进研究