多表连接查询和多次单表查询哪个效率高
在数据量不大的情况下多表连接查询和多次单表查询的效率差不多。如果数据量足够大,那肯定是多次单表查询的效率更高。
有的一些公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。
这种仅限于大表关联查询,如果小表还是建议join查询。
例:
SELECT p.id, sn.name AS nodeName, o.EndTs AS expiryTime, o.PaymentOrder AS consumptionPattern, cus.cusname AS cusName
FROM cloudlink_port p
INNER JOIN cloudlink_servernode sn ON sn.id=p.server_node_id AND sn.deleted =0
INNER JOIN res.res_cusinfcontract o ON o.ContractNo=p.order_no
INNER JOIN res.res_cusinf cus ON cus.id=p.customer_id
WHERE p.order_no='L2021082459016';
可以分解成下面这些查询来代替:
SELECT p.id FROM cloudlink_port p LIMIT 1;
SELECT sn.name FROM cloudlink_servernode sn WHERE sn.deleted =0 LIMIT 1;
SELECT o.EndTs, o.PaymentOrder FROM res.res_cusinfcontract o LIMIT 1;
SELECT cus.cusname FROM res.res_cusinf cus LIMIT 1;
需要注意的是,如果查询只有1条的情况下,加上 limit 1 效率会更高,
大致一看,也没什么大差别,原本一条查询,这里却变成了多条查询,返回结果又是一模一样。到底为什么要这样做?这样做的优势是啥?带着问题往下看。
用分解关联查询的方式查询具有以下优势:
- 多次单表查询,让缓存的效率更高;许多应用程序可以方便地缓存单表查询对应的结果对象。对 MYSQL 的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
- 将查询分解后,执行单个查询可以减少锁的竟争。
- 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。很多高性能的应用都会对关联查询进行分解。
- 查询效率也可能会有所提升;这个例子中,使用 IN() 代替关联査询,可以让 MYSQL 按照 ID 顺序进行査询,这可能比随机的关联要更高效。
- 可以减少冗余记录的查询;在应用层做关联査询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗。
- 这样做相当于在应用中实现了哈希关联,而不是使用 MYSQL 的嵌套循环关联。某些场景哈希关联的效率要高很多
- 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。
- 一些大公司明确规定禁用join,因为数据量大的时候查询会很慢,所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是如果在数据量达到几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。
多表连接查询和多次单表查询哪个效率高相关推荐
- mysql 一对多 右表多条记录合并_MYSQL 单表一对多查询,将多条记录合并成一条记录...
一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...
- mysql同张表关联多次查询_MySQL多次单表查询和多表联合查询
Tip:不建议执行三张表以上的多表联合查询 对数据量不大的应用来说,多表联合查询开发高效,但是多表联合查询在表数据量大,并且没有索引的时候,如果进行笛卡儿积,那数据量会非常大,sql执行效率会非常低 ...
- mysql 评价表设计_来聊聊mysql单表评论系统怎么设计
评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样.一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根 ...
- iBatis 事务控制 与 两表操作将SQL语句写入单表
事务控制 示例: // move data from temp_table to work_tabletry {sqlMapClient.startTransaction();T03SlipWk or ...
- 表操作,数据操作,单表查询,python操作数据库
1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...
- rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法
rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...
- mysql为何500w拆表_【mysql】MySQL 单表500W+数据,查询超时,如何优化呢?
1.问题描述: MySQL 数据库,单表 `im_data_record`,查询超时(30s) 表结构如下图: 表索引如下图: 查询语句如下: SELECT `record_global_id`, ` ...
- mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧
mysql在网站开发中,越来越多人使用了,方便部署,方便使用.我们要掌握mysql,首先要学习查询语句.查询单个表的数据,和多个表的联合查询. 下面以一些例子来先简单介绍下单表查询. 操作方法 01 ...
- 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...
前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...
- 详解oracle多种表连接方式,详解Oracle多种表连接方式
ORACLE 多表连接与子查询 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连接- ...
最新文章
- 通过Katalon Automation Recorder 3步实现自动化测试
- 配置 Azure 文件-4-1-Azure 文件共享
- Java对象转换为Json对象
- 阿里云重磅发布云原生裸金属方案:裸金属+容器,解锁云计算的新方式
- 活动的批输入监控ENV
- 深入理解PHP Opcode缓存原理
- 它来了,带着曝光图又来了!疑似小米MIX4谍照流出
- keras笔记(3)-猫狗数据集上的训练以及单张图片多张图片的测试
- UITextField 和 UITextView实现字数限制 输入若干字以后就无法继续输入的功能
- 如何从QC中导出测试用例及其测试步骤
- LINUX下载编译libxml2
- 苹果iOS设备解锁软件:iToolab UnlockGo
- 【学会了学会了】Flink官网翻译——Flink集群部署概览
- 如何在HTML标题中添加或改变图片
- Android HAL层
- The following packages will be SUPERCEDED by a higher-priority channel是什么意思?
- oracle的dmp导出,oracle数据库dmp文件的导出和导入方法
- 有道云笔记迁移到为知笔记
- Python 乘法口诀
- opencv通过mask取目标纯色背景图
热门文章
- pytorch学习笔记7--循环神经网络、GAN
- openssl_sign(): supplied key param cannot be coerced into a private key
- Github多人协作
- 【新知实验室】腾讯云TRTC接入测试以及状态同步功能重点验证
- Oracle转换Postgres
- 本人对Oracle Bill Of Material模块的一些了解
- C++ atuo关键字的应用 -- 尾置返回类型(trailing return type)
- 重磅!「自然语言处理(NLP)」全球学术界”巨佬“信息大盘点(一)!
- Error处理: android.media.MediaRecorder.start(Native Method) 报错:start failed: -19
- 工具类APP如何做ASO优化推广