子查询就是查询中又嵌套的查询,表链接均可以用子查询,但不是全部子查询都能用表链接替换,子查询比较灵活,方便,形式多样,适合用于做为查询的筛选条件,而表链接更适合与查看多表的数据。html
子查询不必定须要两个表有关联字段,而链接查询必须有字段关联(所谓的主外键关系)mysql
- 表关联的效率要高于子查询,由于子查询走的是笛卡尔积
- 表关联可能有多条记录,子查询只有一条记录,若是须要惟一的列,最好走子查询
对于数据量多的确定是用链接查询快些,缘由:由于子查询会屡次遍历全部的数据(视你的子查询的层次而定),而链接查询只会遍历一次。git
可是数据量少的话也就无所谓是链接查询仍是子查询,视本身的习惯而定。通常状况下仍是用子查询来的好,容易控制
sql
为何子查询比链接查询(LEFT JOIN)效率低
MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,能够一次完成不少逻辑上须要多个步骤才能完成的SQL操做。子查询虽然很灵活,可是执行效率并不高。
那么问题来了,什么是子查询?为何它的效率不高?
子查询:把内层查询结果看成外层查询的比较条件数据库
示例:
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
执行子查询时,MYSQL须要建立临时表,查询完毕后再删除这些临时表,因此,子查询的速度会受到必定的影响,这里多了一个建立和销毁临时表的过程。服务器
优化方式:
可使用链接查询(JOIN)代替子查询,链接查询不须要创建临时表,所以其速度比子查询快。ide
子查询和关联查询的效率问题
MSDN对子查询的定义是这样的:函数
能够将一个查询的结果用做另外一个查询的输入。能够将子查询的结果用做使用 IN( ) 函数、EXISTS 运算符或 FROM 子句的语句。
一条好的值得称赞的规则是尽可能用链接代替全部的子查询。优化器有时能够自动将子查询“扁平化”,而且用常规或外链接代替。但那样也不老是有效。明确的链接对选择表的顺序和找到最可能的计划给出了更多的选项。当你优化一个特殊查询时,了解一下是否去掉自查询可产生很大的差别。这段话出自http://www.innovatedigital.com/htm_speek/SQLServerOpt.shtml它显然告诉咱们在查询的时候最好不要用子查询,当时我并不太在乎,至到我有一次遇到了这样的状况。
如今的网站主要的压力都来自于数据库,频繁的数据库访问常常会使服务器死机。个人原则就是尽可能减小数据库的链接,能一次性取出的决很少链接数据库一次,可是有时候并不彻底是这样。郁闷,无解。
下面一条SQL语句里面有一个子查询,info.RESOURCE_VOLUMECOUNT,它是指一个电影共有多少集.这个字段是int类型的.子查询的目的就是计算出一个电影在资源表中总共有多少集(实际存在的), 二者作减法操做就能够计算出这个电影共缺多少集(lastCount)咱们知道在这条语句执行的时候,外层记录查询一次在计算 lastCount字段的时候又要查询表:电影表一次.若是最外层有10条记录,那么执行此次查询一共要扫描电影表11次,链接数据库1次.
优化
基于有的朋友看不明白我写的SQL语句,多是由于我写的有些字段和本案例没有太大关系的缘由,如今特将它们作一个替换.网站
通过我的实践,证实子查询效率特别低,而通常的子查询均可以由关连查询来实现相同的功能,关联查询的效率要提升不少,因此建议在数据查询时避免使用子查询(尤为是在记录不少时),而最好用关联查询来实现。
如今举例说明。
我作的是简单的北京公交查询系统,用的是MySQL数据库,数据库包含两张表,line表和track表。line表有lid和lname两个属性,分别表示线路id和线路名称。track表有lid,seq,sname,lo,la五个属性,分别表示站点所在的线路id,站点在线路上的顺序,站点名称,站点的经度和纬度。如今要查询某一给定线路名称的线路上全部站点的经度和纬度。其中line中有1112条记录,track中约有20万条记录。
子查询sql语句:select lo,la from track where lid in (select lid from line where lname like '%lname%');
关联查询sql语句:select lo,la from track,line where line.lname like '%lname%' and line.lid=track.lid;
子查询运行时间为5分48秒;而关联查询耗时不足一秒。事实胜于雄辩,关联查询的优点不言而喻。
在关联查询时要注意:where子句中必定要包含表之间的链接条件,如 line.lid=track.lid,不然查询结果会彻底超乎咱们的想象,形成没必要要的麻烦。
参考连接: