|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。优化初进oracle殿堂的人,在学写SQL语句时一样平常会失掉一个教导,那就是exists比in更要高效,但细心设想如果真的这么复杂那爽性往失落in,岂不是省往良多贫苦?
本人对这两种查询语句写法的熟悉也对照浅易,可是以为仍是对照无效,以是有乐趣的能够瞄一眼哦
......
先说IN
他相称对innertable实行一个个带有distinct的子查询语句,然后失掉的查询了局集再与outertable举行毗连,固然毗连的体例和索引的利用仍旧同于一般的两表毗连。
select*fromT1wherexin(selectyfromT2);
能够转换成以下
select*from
T1,(selectdistinctyfromT2)T2
whereT1.x=T2.y;
再说exists
实践上exists相称于对outertable举行全表扫描,用从中检索到的每行与innertable做轮回婚配输入响应的切合前提的了局,其次要开支是对outertable的全表扫描(fullscan),而毗连体例是nestedloop体例。
能够写成
select*fromT1whereexists(selectNULLfromT2whereT2.y=T1.x);
转换成
forcursor1in(select*fromT1)
loop
if(exists(selectNULLfromT2whereT2.y=cursor1.x))
then
前往婚配的纪录;
endif;
endloop;
经由过程下面的注释,如今很简单分明当T2数据量伟大且索引情形欠好(大批反复值等),则不宜利用发生对T2的distinct检索而招致体系开支伟大的IN操纵,反之当T1表数据量伟大(不受索引影响)而T2表数据较少且索引优秀则不宜利用引发T1全表扫描的EXISTS操纵,索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。 |
|