`
forchenyun
  • 浏览: 309753 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据库联合查询的思考

阅读更多

转自:巴士飞扬-技术BLOG : http://www.busfly.cn/

昨天晚上和网友讨论了一个关于数据库联合查询的效率的问题.说实话,以前我一直没怎么考虑过这个问题,在写SQL时,都没怎么考虑,似乎一切都成了习惯,或者已经懒散贯了,但是,网友和我聊起来了,我也就好好考虑起这个问题了,平时不考虑时不知道,真正好好计较一下,才发现还有很多门道.

假设我们有三个表,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, cwhere 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 cwhere 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 cwhere ab.id=c.bid


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

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

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

分享到:
评论

相关推荐

    支付系统数据库设计思考.pdf

    ⽀付系统数据库设计思考 主⽀付表 字段名 字段类型 备注 id bigint(16) 主键id order_id varchar(24) 订单号 bus_pay_no varchar(24) ⽀付id Pay_status varchar(24) ⽀付状态 total_amount bigdecimal(16,2) 总⾦额...

    2013年中国数据库大会-09-主流开源NoSQL及分布式存储的应用与思考

    自2010年以来,国内领先的IT专业网站IT168联合旗下ITPUB、ChinaUnix技术社区已经连续举办了三届数据库技术大会,每届大会超过千人规模,云集了国内技术水平最高的数据架构师、DBA、数据库开发工程师、研发总监、IT...

    租车系统模块与数据库设计.docx

    其主键为一联合键,包括CarCategory_ID(表明车型,如:乐风 1.6 MT),DateType_ID(表明是平日,周末或节日),BasePrice_StartDate(表明从哪个时间点开始顾客在系统页面看到新的价格),其中CarCategory_ID,...

    MySQL到NoSQL:数据的重思和查询方式的转换

    从关系型数据库转移至NoSQL数据库——比如从MySQL转移到Couchbase,你需要对你的数据进行再思考。至于为什么是Couchbase而不是MongoDB什么的,因为博文的作者MCBrown是现任Couchbase副总裁,所以你懂得;同时这篇...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     A.4.4 联合查询  A.4.5 报表查询 附录B Java语言的反射机制  B.1 Java Reflection API简介  B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java...

    精通LoadRunner源程序

    描述了软件测试中典型的性能测试场景、工具的安装、性能测试的基础概念,介绍了脚本的调试技术,并以典型的B/S、C/S实例讲解了多个协议、事务、集合点、检查点、思考时间、关联、IP欺骗、多机联合测试等技术在工具中...

    Oracle 10g 开发与管理

    多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 9 一. Oracle的安装 9 二. 用浏览器进入em 企业管理器 11 三....

    2021云计算峰会(Cloud Insight Conference,CIC)PPT汇总(43份).zip

    平凯星辰、酷克数据、青云科技 金融联合解决方案 数据中心数字化运营转型 四、开源数据库技术分享及未来展望论坛 开源软件悖论:做的越好越收不到钱?- 开源数据库商业模式探讨 RadonDB 兼容万象的云数据库-新一代...

    大数据与图书馆服.pptx

    速度Velocity 大数据对数据实时处理有着极高的要求,需要实时反馈结果,捕捉、分析、处理每一瞬时出现的数据,因此通过传统数据库查询方式得到的当前结果很可能已经没有了价值。 真实性Veracity 大数据策略可以提供...

    智能工厂的五大特征.docx

    根据实际形势的输入可以自动分析判断、逻辑推理,思考下一步的落子,在人工智能领域形成了对人类围棋的绝对压倒性优势,AlphaGo的出现象征着计算机技术已进入人工智能的新信息技术时代(新IT时代),未来将于医疗等行...

    网店客户数据分析.pptx

    绘制访客的用户画像 任务背景 用户画像,即用户信息标签化 淘宝一直在倡导的个性化--千人千面 淘宝的千人千面是依靠淘宝网庞大的数据库,构建出买家的兴趣模型 网店客户数据分析全文共41页,当前为第23页。...

    Google.Android开发入门与实战

    继2008年9月第一款基于Android平台的手机G1发布之后,预计三星、摩托罗拉、索爱、LG、华为等公司都将推出自Gflg~Android平台的手机,中国移动也将联合各手机厂商共同推出基于Android平台的OPhone。按目前的发展态势...

    数据仓库基础

    思考题.....................................................................................................................................37 复习题.......................................................

Global site tag (gtag.js) - Google Analytics