首页 > 范文大全 > 正文

《数据库原理》课程中查询优化技术的教学研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇《数据库原理》课程中查询优化技术的教学研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:查询技术对于关系数据库的性能,特别是对于执行复杂SQL 语句的性能而言至关重要。要使学生在最短的时间内学会、学好数据库的数据查询技术,就要选用适合他们理解能力和接受能力的教学方法,采用理论+实践的教学方法,才能提高教学效果。

关键词:查询;索引;连接;联合

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)24-1353-02

The Analysis of Teaching method of the Database Query Optimizing Technology in "the principle of the database"

FAN Zhi-ping

(School of Computer department, Guangzhou university, Guangzhou 510006,China)

Abstract:the database query is very important in the property of the database, especially in executing the complicated SQL language. For students, TO master it quickly, We must use the principle add the practice method .enhances the teaching effects.

Key words: query; index; join; union

1 引言

数据库技术的日益发展 ,使其应用越来越广泛,已逐渐成为现代计算机信息系统和计算机应用系统的基础和核心数据库的高效性、安全性、稳定性、延展性,是系统成功的关键之一。

数据库最基本的任务是存储、管理数据,而终端用户唯一能看到的数据库特性就是其性能:数据库以何速度处理某一指定查询的结果,并且将结果返回到用户所用的工具和应用程序。数据库是否高效的一个重要指标就是响应时间,响应时间短,查询就可以使用更少的时间,所以响应时间短,反应速度快是高效率的一个表现。

2 数据库查询优化的意义

许多学生认为查询优化是DBMS(数据库管理系统)的任务,与自己所编写的SQL语句关系不大,这是错误的。一个好的查询计划往往可以使程序性能提高数十倍。查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大、查阅新闻、 查看文件、 查询统计信息等。下面以MySql应用实例为基础,结合数据库理论,介绍查询优化技术运用。

3 数据库查询优化的技术

3.1 正确使用索引

索引是提高查询速度的最重要的工具。当然还有其它的一些技术可供使用,但是一般来说引起最大性能差异的都是索引的正确使用。它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候,性能提高更为明显。在下面的情况下应该使用索引来提高数据库的查询速度:

1) 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

2) 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

3) 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

3.2 避免在大型表行数据的顺序存取

在嵌套查询中,对表的顺序存取对查询效率可能产生很大的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001

UNIONSELECT * FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

3.3 使用连接(JOIN)来代替子查询(Sub-Queries)

这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:

DELETE FROM customerinfo

WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN).. 替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:

SELECT * FROM customerinfo

WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

如果使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:

SELECT * FROM customerinfo

LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID

WHERE salesinfo.CustomerID IS NULL

连接(JOIN).. 之所以更有效率一些,是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

3.4 使用联合(UNION)来代替临时表

可以把需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了,要注意的是所有 SELECT 语句中的字段数目要想同。下面的例子就演示了一个使用 UNION的查询。

SELECT Name, Phone FROM client

UNION

SELECT Name, BirthDate FROM author

UNION

SELECT Name, Supplier FROM product

3.5 尽量减少对数据库的访问

当执行每条SQL语句时,数据库在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少数据库的工作量。例如,下有面2种方法可以检索出雇员号等于100或1000的职员。

方法1(两次访问数据库,低效):

SELECT EMP_NAME, SALARY, GRADE

FROM EMP/*访问数据库 */

WHERE EMP_NO=100;

SELECT EMP_NAME, SALARY, GRADE

FROM EMP /*访问数据库 */

WHERE EMP_NO=1000;

方法2(一次访问数据库,高效)

SELECT A.EMP_NAME, A.SALARY, A.GRADE,

B.EMP_NAME, B.SALARY, B.GRADE

FROM EMP A,EMP B /*访问数据库*/

WHERE A.EMP_NO=100AND B.EMP_NO=1000;

4 结束语

上面列出了几个数据库查询优化的技术,实际上远不止这些。20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。我们的优化要抓住关键问题,对于数据库原理的教学,我们应当结合实际情况来设计和优化SQL语句,提高SQL的执行效率。

参考文献:

[1] 孟小峰,李战怀,等,数据库性能调优:原理与技术[M],电子工业出版社,2004.

[2] 萨师萱,王珊著.数据库系统概论[M],清华大学出版社,1999.

[3] 徐小青, 路晓村 MySQL完全手册[M] ,电子工业出版社,2004.