织梦CMS - 轻松建站从此开始!

罗索

SQL查询效率

jackyhwei 发布于 2010-12-29 23:08 点击:次 
一般我们的查询语句是这样的:select * from a,b,c where a.id=b.aid and b.id=c.bid那这些的查询效率大概是怎样的呢?它相当于先将这三表进行组合,再遍历查询,查询量为100*200*300=600万.好像很吓人
TAG:

假设我们有三个表,A表,B表,C表.其数据量分别为100,200,300条记录.并且假设每次都是完全遍历所有数据才找到结果(其实一般情况下不会真的需要完全遍历完才能找到结果),并且假设不考虑索引,当然,就算不排除这些因素,结果比例还是一样的,只是数据大小上有点不一样.并且假设每次查询都查出10个结果.


一般我们的查询语句是这样的:

select * from a,b,c where a.id=b.aid and b.id=c.bid

那这些的查询效率大概是怎样的呢?它相当于先将这三表进行组合,再遍历查询,查询量为100*200*300=600万.好像很吓人,这只是1,2,3百的三个表,如果个1,2,3百万,千万呢,那是不是很恐怖呢?


那我们应该如何进行优化呢?依我的理解,可以不使用三表联合查询,分成多个查询,过滤大量的数据再进行联合,这样的话,再联合时,就可以大量减少遍历次数,比如以下方式:

方式1: 将三表联合分成两个2表联合查询,如:先进行AB联合查询,再将结果与C联合. 这样查询遍历次数为:100*200+10*300 =2.3万.

类似的SQL为: select * from (select * from a , b where a.id = b.aid) as ab, c where ab.id=c.bid

方式2:先对各表进行过滤,再进行三表联合,或者2表联合: 这样查询的遍历次数为:100+200+300+10*10*10=1600.,或者:100+200+300+10*10+10*10=800.

类似的SQL为: select * from (select * from a where ...)as a,(select * from b where ....) as b, (select * from c where ....) as c where a.id=b.aid and b.id=c.bid

或者: select * from (select * from (select * from a where ...)as a ,(select * from b where ....) as b where a.id = b.aid) as ab, (select * from c where ....) as c  where ab.id=c.bid


根据以上的思考,结果很吓人,经过对比,发现,结果好恐怖,遍历次数差别简直就是.........比比看看:600万--2.3万--1600--800,这种比例实在太恐怖了,我不得不对联合查询产生了动摇,难道我们为联合查询的便利,就付出如此巨大的浪费吗?我们真的应该重新审视一下,我们平时已经习惯的编程习惯,以及那些我们认为理所当然的代码.

当然,以上的计算,有着很多的假定在里面,实际的结果,在不同的数据量,不同的数据库,不同的数据面前,都会有很大的差异,但是,不可否认联合查询的效率,确实不容乐观,如果有需要优化数据查询,特别是大数据量的情况下,很值得思考.

以上只是我的思考,并不代表事实就如此,也许,我一开始的思维方式就错了,如果你有想法,请给我评论时提出,有时间我们一起去验证一下.

(hanchaoman)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10693.html]
本文出处:CSDN博客 作者:hanchaoman
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容