首页 > 其他分享 >使用with 还是 join

使用with 还是 join

时间:2024-02-05 11:46:30浏览次数:35  
标签:缓存 join 还是 查询 单表 数据量 使用 关联

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

多次单表查询,让缓存的效率更高;许多应用程序可以方便地缓存单表查询对应的结果对象。对 MYSQL 的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。

将查询分解后,执行单个查询可以减少锁的竟争。

在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。很多高性能的应用都会对关联查询进行分解。

查询效率也可能会有所提升;这个例子中,使用 IN() 代替关联査询,可以让 MYSQL 按照 ID 顺序进行査询,这可能比随机的关联要更高效。

可以减少冗余记录的查询;在应用层做关联査询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗。

这样做相当于在应用中实现了哈希关联,而不是使用 MYSQL 的嵌套循环关联。某些场景哈希关联的效率要高很多

单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。

一些大公司明确规定禁用join,因为数据量大的时候查询会很慢,所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是如果在数据量达到几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。


建议只使用model操作数据库,后续做分表和改变名等一些操作比较方便,
如果真的不行的方法才使用Db类,后续改动地方也不多。
一般使用with即可,withJoin一般只关联一层
多层关联可以使用Db类
laravel的with也差不多,没有多层join关联
A->B 如果B不存在,去掉整条,可以使用withJoin查询出来所有存在的id_arr,后面再使用in id_arr方法

在数据量不大的情况下多表连接查询和多次单表查询的效率差不多。如果数据量足够大,那肯定是多次单表查询的效率更高。
有的一些公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。

标签:缓存,join,还是,查询,单表,数据量,使用,关联
From: https://www.cnblogs.com/hlgg/p/18007668

相关文章

  • 关于头文件的使用
    关于头文件的使用这里写一下这个东西,毕竟我在使用的时候还是有不少的疑问一、头文件头文件就是在写C++代码的时候,在最开头几行引用的文件,这里比如说:#include<iostream>我们就是引用了一个名称为iostream的头文件这里这个文件为什么没有后缀名呢,这我就不是很清楚了,据......
  • 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统
    使用了标准库头文件<setjmp.h>中的setjmp和longjmp两个函数,构建了一个简单的查询式协作多任务系统,支持独立栈和共享栈两种任务。其中涉及到获取和设置栈的地址操作,因此还需要根据不同平台提供获取和设置栈的地址操作(一般是汇编语言,因为涉及到寄存器)该调度系统仅运行在一个......
  • 理解日志基础:使用Python进行有效的日志记录
    源码分享https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tab=BB08J2日志记录是任何软件开发过程中的一个基本组成部分,尤其是在爬虫开发中。有效的日志记录策略可以帮助开发者监控爬虫的行为,诊断问题,以及追踪爬虫的性能。Python的logging模块提供了一套强大的日志记录工具,它可以帮助......
  • service命令使用笔记
    一、简介#service--helpUsage:service[-h|-?]servicelistservicecheckSERVICEservicecallSERVICECODE[i32N|i64N|fN|dN|s16STR|null|fdf|nfdn|afdf]...Options:i32:Writethe32-bitintegerNintothes......
  • c语言判断是文件还是文件夹,软链接,硬链接
    摘自:文心一言在C语言中,可以使用stat()函数来判断一个路径对应的是文件、文件夹或者其他类型。#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>intmain(){charpath[]="/path/to/file_or_folder";//要判断的路径structstatfileInfo......
  • 4.WPF样式使用规范
    在Web开发的时候,编写css样式的时候通常是统一写在.css样式文件中。在WPF中也可以使用这样的思想。样式引用:1.新建一个项目用于统一存放样式WPF.UI添加一个资源字典Button.xaml或者CheckBox.xaml等等....<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/......
  • 关于POSIX定义的宏S_ISLINK(),S_ISREG()的使用
    摘自:https://forum.ubuntu.org.cn/viewtopic.php?t=380854我在学习linuxC系统编程,书上有个源代码可以实现自己的ls命令,不过在查错的过程中这个问题卡了我很久#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<sys/stat.h>#include<......
  • SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实
    场景关于线程池的使用:Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_......
  • SpringCloud工程添加openfeign使用服务之间调用
    SpringCloud服务之间的调用可以采用openfeign,今天这里就简单记录下需要做的步骤。前置条件就是微服务都建好了,并且两个服务都注册到nacos上,这里用两个微服务模块。简单描述:请求A模块,然后去调用B模块数据,最后从A模块接口返回。需要在A模块添加openfeign的依赖和service写好接口,B......
  • [转]gdb源码安装,指定使用的python版本
    转自:https://www.cnblogs.com/shengulong/p/8053370.html gdb调试python的时候,需要根据不同的python版本2.6、2.7、3.x安装相应的gdb;如何指定关联的python版本?下面gdb源码,解压后,进入目录:./configure-h并没有发现--with-python的选项。没有也没有问题,没有也可以自己加:whi......