转自:巴士飞扬-技术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,这种比例实在太恐怖了,我不得不对联合查询产生了动摇,难道我们为联合查询的便利,就付出如此巨大的浪费吗?我们真的应该重新审视一下,我们平时已经习惯的编程习惯,以及那些我们认为理所当然的代码.
当然,以上的计算,有着很多的假定在里面,实际的结果,在不同的数据量,不同的数据库,不同的数据面前,都会有很大的差异,但是,不可否认联合查询的效率,确实不容乐观,如果有需要优化数据查询,特别是大数据量的情况下,很值得思考.
以上只是我的思考,并不代表事实就如此,也许,我一开始的思维方式就错了,如果你有想法,请给我评论时提出,有时间我们一起去验证一下.
分享到:
相关推荐
【实验三 数据库的查询和视图】 实验三主要涵盖了SQL语言中关于数据库查询和视图的基本操作,目的是让学生熟练掌握...实验的思考与练习部分旨在巩固这些概念,并引导学生解决更复杂的问题,如多表联合查询和条件筛选。
在处理复杂的数据库关联查询时,MyBatis 提供了多种解决方案,包括一对一、一对多、多对一以及多对多关系的映射。下面将详细讲解这些概念以及如何在 MyBatis 中进行操作。 1. **一对一关联查询(One-to-One)**: ...
同时,不依赖回调状态,而是通过查询最新状态来确保信息的准确性。 对于联合支付,例如余额+支付宝组合,通过设置union_id关联多个从支付单,并在回调时检查支付宝的支付金额是否与主支付单的余额一致,从而确定...
- **学生信息与班级信息联合查询**:利用`JOIN`操作展示学生和其所在班级的详细信息。 - **课程对比查询**:通过`EXCEPT`操作比较不同课程的选修学生名单。 - **特定条件下的学生筛选**:例如,查找与特定学生同班的...
良好的数据库结构不仅能够支撑海量数据的处理,还能够提高查询效率,确保数据的一致性和完整性。以下是对电子商务网站数据库设计的重要知识点进行的详细解读。 #### 数据库设计原则 1. **反映客观现实**:数据库的...
大会是由国内领先的IT专业网站IT168及其旗下ITPUB、ChinaUnix技术社区联合举办的,已经连续举办了三届,每届都有超过千人参加,涉及的主题包括大数据应用、数据架构、数据管理(数据治理)、传统数据库软件等技术...
### 对于AI产业趋势的思考:生成式AI驱动向量数据库加速发展 #### 核心观点解析 **一、ToB生成式AI应用与向量数据库的紧密关联** 随着生成式AI技术的发展,特别是针对ToB(面向企业)场景的应用日益增多,外挂...
理想情况下,优化应该始于系统设计阶段,包括应用程序和数据库的联合优化。然而,现实中往往面临的是已存在问题的系统,数据库人员需要在混乱中寻找优化路径。根据统计,应用程序设计占据了性能影响的60%,数据库...
联合式(复合式)主键是使用多个字段组合成的主键,适用于没有单一字段能唯一标识记录的情况,但可能增加JOIN操作的复杂性;时间序列+随机数式或“COMB(Combine)”类型主键则结合了时间戳和随机数,既保证了唯一性...
通过`SELECT`,不仅可以执行简单的单表查询,还能处理复杂的多表联接、联合查询以及嵌套查询,使得数据提取变得灵活且高效。 2. **`SELECT`语句的结构** `SELECT`语句的基本语法包括以下几个主要部分: - `SELECT...
视图是数据库中的一个重要组成部分,它允许用户创建基于已有表的虚拟表,只用于查询和展示数据,而非实际存储数据。实验中,你需要创建两个视图,一个是显示每门课程的平均成绩,包含课程号和平均成绩;另一个则在此...
同理,创建`SC`表,`sno`和`cno`作为联合主键: ```sql CREATE TABLE SC( SNO CHAR(7) NOT NULL, CNO CHAR(4) NOT NULL, PRIMARY KEY (SNO, CNO) ); ``` 2. **参照完整性**: 参照完整性确保引用的数据...
多表查询涉及到对两个或更多表的联合操作,目的是获取这些表中的关联数据。当单表查询无法满足需求时,多表查询就显得尤为必要。在SQL中,多表查询主要通过JOIN操作实现,包括内连接(INNER JOIN)、外连接(LEFT JOIN,...
4. 联合查询:学习JOIN操作,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,以合并来自多个表的数据。 5. 子查询:了解如何在查询中嵌套查询,以实现更复杂的逻辑。 6. 分组和聚合函数:使用GROUP BY进行数据...
本文档——《能力素质模型工具之胜任力数据库.doc》详细列出了几个关键能力领域的行为表现等级,包括远见卓识、系统思考、制订决策、建设团队、尊重和培养人才以及授权和指导下属。 1. **远见卓识**:这一能力主要...
通过以上知识点的总结,我们可以看出,SQL语言提供了强大的数据处理能力,涵盖了从基础数据检索到复杂条件筛选、多表联合查询以及数据汇总分析等功能。熟练掌握这些SQL语句对于进行有效的数据库管理与数据分析至关...
从关系型数据库转移至NoSQL数据库——比如从MySQL转移到Couchbase,你需要对你的数据进行再思考。至于为什么是Couchbase而不是MongoDB什么的,因为博文的作者MCBrown是现任Couchbase副总裁,所以你懂得;同时这篇...
在大型咨询公司中,《能力素质模型咨询工具》胜任力数据库是一个关键的资源,用于评估和提升领导职位的人员能力。这份PPTX文档详细列举了不同能力领域的行为表现,包括远见卓识、系统思考、制订决策、建设团队以及...