- SELECT
- name
- name
- name
- name
- FROM
- INNER JOIN vendors BON
- A.vendors_id = B.vendors_id
- INNER JOIN bank CON
- A.bank_id = C.bank_id
- INNER JOIN stocks DON
- 张敏 (西安翻译学院计算机教研室)
摘要:数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的一个重要因素就是SQL查询语句的低效率,而在SQL查询语句中多表联接查询的使用频率非常之高,最能体现查询复杂性,往往是SQL优化的重点与难点。为了提高查询速度,提高数据库应用系统的执行效率,文章从分析关系数据库多表查询处理过程入手讨论查询优化技巧,指出多表查询优化的原则。通过几种优化策略的研究,在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。
关键词:SQL 优化 联接
引言
多表联接操作往往要耗费大量的CPU时间和内存,所以多表联接查询在查询优化中起到了至关重要的作用,是数据库中最基本、最常用、最复杂的操作。在数据库的管理信息系统中,联接查询操作是所有数据库操作中所占据比重最大的操作。当数据库系统积累到一定程度,若查询时采用单条顺序扫描,那么扫描一遍所有的记录可能就得花上几十分钟,甚至几小时,这样的系统就失去了现实的使用价值。采取什么样的查询策略,使联接查询时间降低,就是本文需要研究的查询优化问题。
1 优化原理
联接查询操作的前提是笛卡儿积,即要将多表中所有的元组拿来运算,再从中找出符合条件的,其本身就增加了运算的负担,所以我们在做优化时尽量避免联接查询。如果必须要使用联接查询时也要尽量使用较少的联接表,查询优化力图找出给定等价的表达式,但执行效率更高,一个查询往往会有许多实现方法,关键是如何找出一个与之等价的且操作时间又少的表达式。优化的核心问题是尽可能减少查询中各表的参与加工的数据量,从而达到优化时间和空间的目的。
2 联接查询优化的原则
2.1 尽量使用单表操作
给定三个关系模式:(以下实例均以此为例)
s(sno,sname,sec,birthday,email)
c(cno,cname,creadit,tname)
sc(sno,cno,score)
例:查询1001学生选修的课程成绩。
分析:在此查询中涉及到sno和score两个字段,sno在s表中,score在sc表中,若要使用s和sc的联接,
SQL语句为:SELECT score FROM s,sc WHERE s.sno=sc.sno and sno=‘1001’
则此查询就是多表联接查询,这样势必要做笛卡儿积操作,所以会增加检索的时间。
分析:在此查询中涉及到的sno和score两个字段可以在sc表中全部找到,按照尽量使用单表操作原则,可以只用一个sc表。
SQL语句改为:SELECT score FROM sc WHERE sno=‘1001’这样避免了联接时的笛卡儿积操作,大大提高检索速度。
2.2 避免不了的联接操作要做到以下几个原则:
2.2.1 联接表时联少不联多 在做多表联接查询时,联接的表的个数尽量少,这样就可以减少查询中参与加工的数据量,从而达到优化时间和空间的目的。
例:查询选修了“数据库应用”课程的学生的学号和成绩。
期刊文章分类查询,尽在期刊图书馆
分析:此查询中涉及到sno、cname和score三个字段,分别在s、c和sc中,若要使用s、c和sc的联接,
SQL语句为:SELECT sno,score FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
则此查询是多表联接查询,并且联接的三表中,两两都要做笛卡儿积操作,所以会增加检索的时间。
分析:此查询中涉及到sno、cname和score三个字段,分别在c表和sc表中就可以全部找到,按照联接表时联少不联多的原则,可以只用c和sc表。
SQL语句改为:SELECT sno,score FROM c,sc WHERE c.cno=sc.cno and cname=‘数据库应用’
2.2.2 联接表时在联少不联多的基础上要能实现联接 在做多表联接查询时,使联接的表的个数尽量少,但是不能一味的追求表的个数,如果表的使用不能达到我们要查询的数据,或者不能实现联接,那也是不成功的。
例3:查询选修了“数据库应用”课程的学生的姓名。
分析:此查询中涉及到sname和cname两个字段,分别在s表和c表中,若要使用s和c的联接,SQL语句为:SELECT sname,cname FROM s,c WHERE cname=‘数据库应用’则此查询是多表联接查询,但两个表没有公共属性,所以实现不了联接,这样此操作就变成了单纯的笛卡儿积操作,在此联接中会查询出不符合条件的记录,失去了查询的意义。
分析:此查询中涉及到sname和cname两个字段,分别在s表和c表中,但是s表和c表没有公共属性,不能实现联接,所以必须借助sc表,所以此查询是s表、c表和sc表三表的联接。
SQL语句改为:SELECT sname,cname FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
2.3 先筛选后联接
当查询多个数据表时,要先过滤后联接。
例5:查询所有成绩大于70分的学生的信息。
分析:要做s表和sc表两表联接,并筛选出符合条件的记录。
SQL语句为:SELECT*FROM s,sc WHERE s.sno=sc.sno and score>70
此查询语句首先将两个数据表按照学号进行联接,然后再将符合条件的记录筛选。由于两个数据表进行联接时有些记录是以后要筛选掉的,且多个数据表联接是笛卡尔积运算,消耗的时间会随着记录个数的增加很快地增长。
SQL语句改为:SELECT*FROM s,sc WHERE score>70 and s.sno=sc.sno
此联接查询语句克服了以上缺点,首先筛选出符合条件的记录,减少了进行联接的记录个数,然后再执行联接查询,大大提高了查询效率。
3 结束语
查询优化要抓住关键问题,对于数据库应用程序来说,重点在于如何提高SQL的执行效率。在数据库的开发和维护过程中,多表联接查询的优化设计可以提高系统性能,对于数据量大的数据库系统尤为重要。以上介绍的几种优化策略使多表联接查询在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。
多表关联 mysql 多表关联查询优化
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
SQL Server 执行计划3--关联查询
SQL Server执行计划,多表关联查询
Nested Loops Merge Join Hash Match -
MySQL多表联查优化 mysql多表关联查询性能
对数据表的多表查询也是必不可少的, 本篇内容主要给大家讲解多表联合查询的优化。 一、多表查询连接的选择:相信这内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上我就不贴出来了。这图只是让大家回忆一下,各种连接查询。然后要告诉大家的是,需要根据查询的情况,想好使用哪种连接方式效率更高。二、MySQL的JOIN实现原理在MySQL 中,只有一种Join 算
MySQL多表联查优化 join 子查询 效率 join和子查询效率 left join on多表关联 leftjoin多表联合查询 -
MySQL多表关联查询顺序 mysql多表关联查询性能
mysql同张表关联多次查询_MySQL多次单表查询和多表联合查询
MySQL多表关联查询顺序 mysql同张表关联多次查询 数据库 联合查询 单表查询 -
MySQL如何多表关联 mysql的多表关联查询
【MySQL】多表联合查询、连接查询、子查询
MySQL如何多表关联 Mysql 多表联合查询 子查询 连接查询 -
mysql查询多表关联关系 mysql多表关联查询性能
阅读提示本内容为日常频繁使用的数据处理操作,不涉及底层技术问题,烦请爱钻牛角的杠精绕行。本内容尽量简单直白、步骤详细,适合数据分析入门。特别喜欢技术语言的大佬们,可自行跳过。在上一篇:Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱中老海简单介绍了数据的分组聚合以及数据分箱操作。有兴趣的可以翻看之前的内容 本期内容介绍数据的多表关联,以及多表联合操作部
mysql查询多表关联关系 mybatisplus多表关联查询 mysql update多表关联更新 mysql 分组查出来横向展示 mysql 列合并