在数据量不大的情况下多表连接查询和多次单表查询的效率差不多。如果数据量足够大,那肯定是多次单表查询的效率更高。

有的一些公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。

这种仅限于大表关联查询,如果小表还是建议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 效率会更高,

大致一看,也没什么大差别,原本一条查询,这里却变成了多条查询,返回结果又是一模一样。到底为什么要这样做?这样做的优势是啥?带着问题往下看。

用分解关联查询的方式查询具有以下优势:

  1. 多次单表查询,让缓存的效率更高;许多应用程序可以方便地缓存单表查询对应的结果对象。对 MYSQL 的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
  2. 将查询分解后,执行单个查询可以减少锁的竟争。
  3. 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。很多高性能的应用都会对关联查询进行分解。
  4. 查询效率也可能会有所提升;这个例子中,使用 IN() 代替关联査询,可以让 MYSQL 按照 ID 顺序进行査询,这可能比随机的关联要更高效。
  5. 可以减少冗余记录的查询;在应用层做关联査询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗。
  6. 这样做相当于在应用中实现了哈希关联,而不是使用 MYSQL 的嵌套循环关联。某些场景哈希关联的效率要高很多
  7. 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。
  8. 一些大公司明确规定禁用join,因为数据量大的时候查询会很慢,所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是如果在数据量达到几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。

多表连接查询和多次单表查询哪个效率高相关推荐

  1. mysql 一对多 右表多条记录合并_MYSQL 单表一对多查询,将多条记录合并成一条记录...

    一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...

  2. mysql同张表关联多次查询_MySQL多次单表查询和多表联合查询

    Tip:不建议执行三张表以上的多表联合查询 对数据量不大的应用来说,多表联合查询开发高效,但是多表联合查询在表数据量大,并且没有索引的时候,如果进行笛卡儿积,那数据量会非常大,sql执行效率会非常低 ...

  3. mysql 评价表设计_来聊聊mysql单表评论系统怎么设计

    评论系统对于一个网站来说几乎是必不可少的,当然评论系统的设计也多种多样.一般情况下,评论数据表会和一个用户信息表结合使用,就是在评论表中记录的有用户id(例如user_id),然后查询评论数据的时候根 ...

  4. iBatis 事务控制 与 两表操作将SQL语句写入单表

    事务控制 示例: // move data from temp_table to work_tabletry {sqlMapClient.startTransaction();T03SlipWk or ...

  5. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

  6. rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法

    rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...

  7. mysql为何500w拆表_【mysql】MySQL 单表500W+数据,查询超时,如何优化呢?

    1.问题描述: MySQL 数据库,单表 `im_data_record`,查询超时(30s) 表结构如下图: 表索引如下图: 查询语句如下: SELECT `record_global_id`, ` ...

  8. mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧

    mysql在网站开发中,越来越多人使用了,方便部署,方便使用.我们要掌握mysql,首先要学习查询语句.查询单个表的数据,和多个表的联合查询. 下面以一些例子来先简单介绍下单表查询. 操作方法 01 ...

  9. 物理机存放mysql实例原则_MySQL优化笔记(四)--表的设计与优化(单表、多表)...

    前面讲了SQL优化以及索引的使用.设计优化了,那么接下来就到表的设计与优化啦!!!真实地去设计优化单表结构以及讲述多表设计基本原则(结合真实的生产环境的取舍来讲述). 文章结构:(1)单表设计与优化: ...

  10. 详解oracle多种表连接方式,详解Oracle多种表连接方式

    ORACLE 多表连接与子查询 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连接- ...

最新文章

  1. 通过Katalon Automation Recorder 3步实现自动化测试
  2. 配置 Azure 文件-4-1-Azure 文件共享
  3. Java对象转换为Json对象
  4. 阿里云重磅发布云原生裸金属方案:裸金属+容器,解锁云计算的新方式
  5. 活动的批输入监控ENV
  6. 深入理解PHP Opcode缓存原理
  7. 它来了,带着曝光图又来了!疑似小米MIX4谍照流出
  8. keras笔记(3)-猫狗数据集上的训练以及单张图片多张图片的测试
  9. UITextField 和 UITextView实现字数限制 输入若干字以后就无法继续输入的功能
  10. 如何从QC中导出测试用例及其测试步骤
  11. LINUX下载编译libxml2
  12. 苹果iOS设备解锁软件:iToolab UnlockGo
  13. 【学会了学会了】Flink官网翻译——Flink集群部署概览
  14. 如何在HTML标题中添加或改变图片
  15. Android HAL层
  16. The following packages will be SUPERCEDED by a higher-priority channel是什么意思?
  17. oracle的dmp导出,oracle数据库dmp文件的导出和导入方法
  18. 有道云笔记迁移到为知笔记
  19. Python 乘法口诀
  20. opencv通过mask取目标纯色背景图

热门文章

  1. pytorch学习笔记7--循环神经网络、GAN
  2. openssl_sign(): supplied key param cannot be coerced into a private key
  3. Github多人协作
  4. 【新知实验室】腾讯云TRTC接入测试以及状态同步功能重点验证
  5. Oracle转换Postgres
  6. 本人对Oracle Bill Of Material模块的一些了解
  7. C++ atuo关键字的应用 -- 尾置返回类型(trailing return type)
  8. 重磅!「自然语言处理(NLP)」全球学术界”巨佬“信息大盘点(一)!
  9. Error处理: android.media.MediaRecorder.start(Native Method) 报错:start failed: -19
  10. 工具类APP如何做ASO优化推广