在关系型数据库中,多表关联方式是影响性能最大的技术。为什么会把mysql定义为中小型数据库?主要原因是mysql是不支持hash join的。这对多个大表关联查询造成性能的瓶颈。因此,在大数据领域,比较少使用mysql作为后台数据库。不过,也是有规避的方法,例如我们公司bi项目使用mysql,需要把表设计为宽表,进行反范式设计,减少多表关联。虽然单表的数据量大了,但是查询速度快了非常多,从几十秒降到1秒左右。1秒对大数据应用是可以接受的,在oltp应用是不可接受。因此,在oltp应用数据库会进行分库分表设计,这属于垂直拆分。按照业务类型进行拆分多个实例和分库,这属于水平拆分。目标是实现轻数据库重业务模式,很多运算需要放到应用代码执行。这也是基于数据库是CS结构,而业务代码是分布式结构的属性。
言归正传,下面是对数据库关联算法进行分析,不限于mysql。
多表连接的查询方式又分为以下几种:内连接,外连接和交叉连接。外连接又分为:左外连接,右外连接和全外连接。查询方式需要下面多表关联算法来实现:
Nest loop join
嵌套循环关联 适合下面场景,外表是小表,内表是大表,每次外表获取一条记录,会在内表进行一次查询,虽然内表是大表,由于使用高区分度的索引,效率也是非常快。典型的案例维表驱动事实表。
官方文档:http://dev.mysql.com/doc/refman/5.6/en/nested-loop-joins.html
Block Nested-Loop Join
块圈套循环关联 从 mysql 5.6开始支持新的关联方式,每次批量取出部分符合内表的记录,并发处理与内表关联,减少关联次数,提高关联效率。是圈套循环关联的优化版本。
Multi-Range Read(MRR)
多范围读关联,mysql 5.6开始支持新的关联方式,将根据辅助索引获取的结果集根据主键进行排序,将乱序化为有序,可以用主键顺序访问基表,将随机读转化为顺序读,多页数据记录可一次性读入或根据此次的主键范围分次读入,以减少IO操作,提高查询效率。
官方文档: http://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html
Batched Key Access(BKA)
批量键接口关联 从mysql 5.6开始支持新的关联方式,
BKA使用join buffer保存由join的第一个操作产生的符合条件的数据。 然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。提交keys之后,MRR使用最佳的方式来获取行并反馈给BKA .
Sort Merge join
排序混合关联 mysql目前不支持,oracle,sql server,postgresql支持。需要首先对两个表按照关联的字段进行排序,分别从两个表中取出一行数据进行匹配,如果合适放入结果集;不匹配将较小的那行丢掉继续匹配另一个表的下一行,依次处理直到将两表的数据取完。若是关联字段有高区分度的索引,则效率也是非常高。
Hash join
哈希关联 mysql目前不支持,oracle,postgresql支持。下面详细描述oracle的hash join实现方法:Oracle依据hash_area_size/db_block_size/_hash_multiblock_io_count决定hash partition数量,hash表由若干hash partition组成,而每个partition都包含多个hash bucket。表small和big,前者会被选为驱动表,假定其结果集为s,后者为b;驱动表和被驱动表都是最多只被访问一次。哈希表连接的表无需要排序,但是他在做连接之前做哈希运算的时候,会用到HASH_AREA_SIZE来创建哈希表。哈希连接不适用于的连接条件是:不等于<>,大于>,小于<,小于等于<=,大于等于>=,like。哈希连接索引列在表连接中无特殊要求,与单表情况无异。
目前mysql在该方面相对来说是较弱的,我们应该取长补短,使用mysql性能高的地方,减少使用mysql短板的技术。
相关推荐
Delphi 7多表查询深入实践
Delphi 7内置了多种数据库组件,如TTableTQueryTDBGrid等,这些组件支持对数据库的连接、数据访问、数据显示和编辑功能。通过这些组件的组合使用,开发者可以实现高效且功能丰富的数据库应用。参数化查询是一种在SQL语句中使用参数代替直接在语句中嵌入变量值的方法。这种技术不仅提高了查询的安全性,而且提高了代码的可读性和可维护性。在Delphi 7中,我们通常使用TQuery组件来实现参数化查询。下面是一个简单的Delphi 7中实现参数化查询的例子:var。
FLink多表关联实时同步
FLink多表关联实时同步
LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)
本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。
数据 流图
数据流图(DFD)1、一种图形化技术,描绘信息流和数据从输入移动到输出的过程中所经受的变换2、在数据流图中没有任何具体的物理部件,只是描绘数据在软件中流动和被处理的逻辑过程。
总结:知识图谱KG+大模型LLM
知识图谱KG+大模型LLM
vivado下ECO操作-不重新综合实现修改属性并生成.bit
ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要
【软件工程】重要知识点
【软件工程】重要知识点 一、软件工程概述 软件工程的诞生 1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题。在这次会议上正式提出并使用了“软件工程”这个名词,一门新兴的工程学科就此诞生了。 软件危机 ① 对软件开发成本和进度的估计常常很不准确。 ② 用户对“已完成的”软件系统不满意的现象经常发生。 ③ 软件产品的质量往往靠不住。 ④ 软件常常是不可维护的。 ⑤ 软件通常没有适当的文档资料。 ⑥ 软件成本在计算机系统总成本中所占的比例逐年上升。 ⑦ 软件开发生产率提高的速度,既
MOS管热阻的测量方法
实验室内如何测试mos管热阻
几十张表关联查询效率慢
首先你会想到,给表加索引,那么mysql会给主键自动建立索引吗? 会的,当然会。 在我们查询的业务表操作的时候,表业务数据庞大起来的时候,以及left join多的时候,甚至多表关联到几十张表的时候,查询是慢到外婆家里去了。 这时候,只需要给表join查询的字段,及表结构,进行索引优化,即可解决这个慢的问题。 一,首先利用explain 关键字对查询的SQL进行分析。 # type=ALL,全表扫描,MySQL遍历全表来找到匹配行 # type=index,索引全扫描,MySQL遍历整个索引来查询
QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
一、环境介绍 QT版本: 5.12.6 编译环境: win10 64位 目标系统: Android 完整工程源码下载地址(包含APK文件):https://download.youkuaiyun.com/download/xiaolong1126626497/19051696 二、功能介绍 本软件是一款BLE蓝牙串口调试助手,支持常规的发送和接收调试,BLE是低功耗类型蓝牙,在智能家居、物联网领域使用较多。BLE低功耗蓝牙一般不能直接使用手机进行连接,手机蓝牙默认都是工作在传统蓝牙模式,无法直接连接BL..
dify安装ollama插件及OLLAMA模型添加失败问题完整解决方法
plugin_daemon-1 | 2025/05/10 17:37:36 stdio.go:160: [INFO]plugin langgenius/ollama:0.0.6: Installed model: ollama 提示ollama安装成功,再添加模型就不会有问题了。安装dify1.2.0和1.3.1均出现OLLAMA插件安装失败或插件安装后添加模型失败的问题,具体表现为一是添加ollama插件时没反应,需要二次添加才成功;二是添加模型时点保存报500错误或点保存后没反应,无法成功添加。
数据流图(DFD)
本篇涉及内容: 数据流图基本概念 数据字典 数据平衡原则 数据流图基本概念: 1)数据流:由数据组成,箭头表示数据的流向,
claude code desktop中出现Doesn‘t look like an Anthropic model - expected a gateway model route 解决方案
本文主要介绍了claude code desktop中出现Doesn’t look like an Anthropic model - expected a gateway model route referencing an Anthropic model和Server is busy. Retrying的解决方案,希望能对使用claude code desktop的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案
数据仓库宽表
数据仓库宽表
三维点云转深度图
点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
数据库多表关联及子查询
如本次 数据库表格 数据关联为 dept1 和 dept2查询 select *from dept inner join emp on dept.dept1= emp.dept2;隐藏内连接格式:select * from 表1,表2 where 表1.关联字段=表2.关联字段;
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
多表关联查询之内关联,左关联
-- 同学持有的手机记录表 create table student_phone ( id int primary key, stu_name varchar2(20), phone varchar2(200) ) insert into student_phone values (1,'小红','华为 荣耀v9'); insert into student_phone values (...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
ShardingSphere-多表关联
例如:t_order 表和 t_order_item 表,均按照 order_no分片,并且使用 order_no进行关联,则此两张表互为绑定表关系。server-order0的db_order上有t_order0、t_order1、t_order_item0、t_order_ item1。server-order1的db_order上有t_order0、t_order1、t_order_item0、t_order_ item1。order表、order_item表的分片规则是一样的。
【MongoDB】使用$lookup做多表关联处理
这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的一种nosql,但是呢,既然mongodb是无模式的,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用,在这之前,我们可以使用DbRef,但是呢,在mongodb 3.2 中给你增加了一个相当牛逼的手段,那就是$lookup,而且放到了aggre...
多表关联——内连接和外连接
1、内关联 2、外关联之左关联 3、多表关联逻辑演示 4、分析多表关联中出现的数据确实、数据重复问题
玩转达梦の 多表关联更新改写
多表关联更新 多种改写
【SpringBoot Data JPA】多表关联查询
SpringBoot Data JPA 多表关联查询一、数据库架构设计1.1 数据表结构2.2 建立数据库表:二、SpringBoot整合JPA多表查询2.1 环境配置2.2 建立数据库映射模型2.2 编写DAO层接口2.3 在测试类中,测试数据库映射是否正确。2.3 在JPA框架中表关系的分析步骤2.4 映射的注解说明2.5 多表关联查询2.6 测试多表查询 一、数据库架构设计 1.1 数据表结构 传感器基础信息表 sensor_info 传感器种类表sensor_type 传感器(所属面)位置信息表s
mysql中的多表关联查询
在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询 一,内连接查询 是指所有查询出的结果都是能够在连接的表中有对应记录的。 以t_employee(员工表)和t_dept(部门表)为例: t_employee表中的记录如下:dept代表该员工所在的部门 t_dept表中记录如下: 可以发现,其中人力资源部里没有员工(这里只是举例,可能与实际不符,但主要在于逻辑关系),而赵七没有对应..
ORACLE多表关联UPDATE 语句
GPS平台、网站建设、软件开发、系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=1197 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, 1.--客户资料表 2.create table customers 3. ( 4. customer_id number(8) not null, -- 客户标示 5.city_nam
[经验]一次多表关联性能优化
[经验]一次多表关联性能优化缘起尝试添加索引添加视图添加search表进一步优化其他问题思考 缘起 项目初期表拆分的太细,技术负责要求手写sql,mapper.xml中存在很多LEFT JOIN,数据量不是很多的情况下, 发生了一个查询要将近40s的情况,项目本身是汽车相关的项目,会关联到集装箱、客户、订单、车钥匙、各类 服务号等条件,条件本身也很复杂,客户要求多个LIKE查询,单号都无法进行分词...
Flink 维表关联多种方案对比
提到 Flink SQL 如何 Join 两个数据流,有读者反馈说如果不打算用 SQL 或者想自己实现底层操作,那么如何基于 DataStream API 来关联维表呢?实际上由于 Flink DataStream API 的灵活性,实现这个需求的方式是非常多样的,但是大部分用户很难在设计架构时就考虑得很全面,可能会走不少弯路。 针对于此,笔者根据工作经验以及社区资源整理了用 DataStream 实现 Join 维表的常见方式,并给每种的方式优劣和适用场景给出一点可作为参考的个人观点。 衡量指标 总
1078



被折叠的 条评论
为什么被折叠?



