当前位置: 首页 > news >正文

wordpress首页生成静态页面/seo免费

wordpress首页生成静态页面,seo免费,浏阳做网站报价,抖音seo供应商在关系型数据库中,表联接是一种常见的操作,它使得我们可以根据不同的条件将多个表中的数据进行连接。而MySQL作为一种常用的关系型数据库,其表联接算法包括NLJ、BNL、BKA、BNLH等多种,在实际应用中选择不同的算法还需要考虑到数据…

在关系型数据库中,表联接是一种常见的操作,它使得我们可以根据不同的条件将多个表中的数据进行连接。而MySQL作为一种常用的关系型数据库,其表联接算法包括NLJ、BNL、BKA、BNLH等多种,在实际应用中选择不同的算法还需要考虑到数据量、表结构等因素。本文将对MySQL中常见的表联接算法进行浅述,包括各个算法的实现原理和适用场景。

SNLJ算法( Simple Nested-Loops Join,简单嵌套循环连接 )

算法简述

简单嵌套循环连接(Simple Nested-Loops Join)算法基于一个简单的思想,即对于两个输入数据表R和S,Simple Nested-Loops Join算法从表R中选取一条记录,然后循环遍历表S的所有记录,将R和S之间满足联接条件的记录匹配,并将匹配后的结果存放在一个新的结果集中。然后,算法继续从表R中选取下一条记录,重复以上的操作,直到R中所有的记录都被遍历过。见下图:
在这里插入图片描述

优缺点

该算法的一个明显优点是实现简单,实现逻辑清晰明了。

但是存在一个关键问题:*被驱动表S的被扫描的次数等于驱动表R的记录数*

当数据表R和S中的记录数(Rn和Sn)非常大时,所需要扫描的记录条数为RnSn,即笛卡尔积,算法的执行时间会急剧增加。如果两R,S表都有十万条记录,那么RnSn将会是100亿条,这是无法被接受的。

适用场景

由于上述缺点不能够被接受,MYSQL并没有采用该算法,而是实现了效率更高的BNL算法。

BNL算法**(** Block Nested-Loops Join,基于块的嵌套循环联接 )

算法简述

BNL算法在SNLJ算法上做了优化:

首先,将驱动表尽量放到内存当中。理想状态下,驱动表R,全部被放到了内存。然后,将被驱动表S表中的每条记录都在内存中与驱动表R表的记录逐个匹配筛选。

这样被驱动表S只需从磁盘扫描1次,而驱动表也只需要从磁盘扫描一次。这样相比SNLJ算法,扫描被驱动被的次数,从Rn次降低到了1次,大大降低了磁盘IO的压力,从而提高了效率。

如果内存配置不足,不能一次性将驱动表R所有记录加到内存(Join Buffer),那么驱动表会被切分成块,再逐块加载到内存中。这也正是算法名称中Block的含义。

这时,算法过程如下:

将驱动表R分成N块,首先将第一块N1的记录加载到内存(Join Buffer)中,然后扫描被驱动表S,将被驱动表S中的每条记录,逐条加载到内存,与内存中的N1记录进行匹配。然后将驱动表R的第二块N2的记录加载到内存中,然后扫描被驱动表S,将被驱动表S中的每条记录,逐条加载到内存,与内存中的N2记录进行匹配。重复以上操作,直到驱动表的N块记录都添加到内存中,并与被驱动表S所有记录匹配完毕。

可以看出,上述过程中,被驱动表被扫描的次数,也只有驱动表R被分的块数N。这相较于SNLJ算法中的被扫描的次数(驱动表R的记录数),大大减少了。

图示如下:

驱动表第一个块加载到内存,并与被驱动表逐行比较:
在这里插入图片描述

驱动表第二个块加载到内存,并与被驱动表逐行比较:
在这里插入图片描述

驱动表的其他块依次加入内存,并于被驱动表比较,不再画图表示。

适用场景

在被驱动表的联接字段不存在索引时,会使用BNL算法。

相关配置

Join Buffer 由join_buffer_size配置控制,这个配置在BNL算法中决定了驱动表被分的块数,也即是被驱动表被扫描的次数,所以对性能的提升尤为重要。

join_buffer_size 默认为256K,这对于大量数据的场景很显然是不够的,需要手动调大该配置。

join_buffer_size可以全局配置(配置文件[mysqld]模块join_buffer_size参数),也可以在会话级别配置(select /*+ set_var(join_buffer_size=248M) */ * from …;)。

在大表使用BNL算法时,适当提升该配置,将会提升查询效率。

示例

表R和表S的name字段都没有索引。
在这里插入图片描述

Explain 时extra字段中,存在using join buffer(flat,BNL join),表示用到了BNL算法。

INLJ算法( Index Nested-Loops Join,基于索引的嵌套循环联接 )

算法简述

上述BNL算法,尽管使用到了内存,不必一遍遍的从磁盘上扫描被驱动表,但是没有使用索引,所以仍需要在内存中逐行的联接匹配查询,所以联接时所需的比较的次数仍然是驱动表行数Rn被驱动表行数Sn,即RnSn。

如果在联接时被驱动表存在索引,这样就可以利用B+树的特性(层高固定数层,一般3-4层),将联接比较次数降为驱动表行数被驱动表B+树的层高,Rn3或Rn*4(唯一索引的场景,非唯一索引要加上同值个数),这样就大大提高了联接匹配效率。

这就是基于索引的嵌套循环联接INLJ算法的优势。

适用场景

被驱动表的被联接字段有索引,这样才可以用到INLJ算法,从而使联接效率大大提高。

相关配置

该算法不需要配置就可以使用,也是最常用的算法,需要注意的是驱动表选择的问题。

*不同的联接语句哪个是驱动表?*

使用左联接时(left join)时,左侧表是驱动表。

使用右联接时(right join)时,右侧表是驱动表。

使用内连接时(join)时,由优化器自行选择驱动表。

使用内连接时,可以使用straight join代替join,从而指定左侧表是驱动表。

*选择驱动表的原则有哪些?*

被驱动表的联接字段尽量有索引,这样才可以用到高效的INLJ算法。

如果两个表的联接字段索引情况一样(都有索引或都没有索引),要小表驱动大表:在通过where条件过滤后剩余的参与join计算的个字段数据总量小的表,作为驱动表。这样无论是INLJ算法还是BNL算法,效率都会相对较高。

示例

在这里插入图片描述

通过explain可以看到S表关联查询时,用到了主键索引,Extra中没有其他信息,这说明用到了INLJ算法。

BKA算法(Batched Key Access Join,批量键访问联接)

算法简述

INLJ算法虽然已经用到了被驱动表的索引,但是,当用到的索引是二级索引且需要回表时,就会因回表产生大量的随机IO。如下图:

在这里插入图片描述

BKA算法就是在INLJ的基础上优化这个问题,想办法将回表时的随机IO变成顺序IO。

具体来说,BKA算法使用到了join_buffer,一次性从驱动表(或上次join的结果)取出多条记录,放到join_buffer中,通过引擎的MRR接口,得到的顺序的回表主键ID。进而使用有顺序的主键ID,回表查询,使得回表动作由随机IO变成了顺序IO,从而提高效率。

如下图:

在这里插入图片描述

进一步的,可以使用MRR接口进行进一步优化。

在上述联接中,查询被驱动表索引时(上例中的S.score),也是随机顺序的。可以先根据主键id排序,然后再查询,这就使对被驱动表的索引查询由随机顺序,改为了顺序查询,进而进一步提高查询效率。这也就是BKA算法中的MRR键排序(Key Sorting for Batched Key Access)。

适用场景

当被驱动表的联接字段是二级索引且不是覆盖索引,需回表获取数据,且需查询的数据量巨大,可以考虑使用BKA算法进行优化。

相关配置

*开启MRR*

set optimizer_switch=‘mrr=on’;

*开启MRR键排序*

set optimizer_switch=‘mrr_sort_keys=on’;

*调整join cache级别*

set join_cache_level=6;

示例

在这里插入图片描述

执行计划中extra字段中有Using join buffer (flat, BKA join); Rowid-ordered scan,说明使用到了BKA算法,并对主键进行了排序,然后扫描数据。

*开启MRR键排序的场景*

在这里插入图片描述

可以看到执行计划中extra字段多了Key-ordered,说明使用了MRR键排序能力。

BNLH算法(Block Nested Loop Hash join,基于块的嵌套循环哈希联接)

算法简述

基本思想如下,首先将驱动表数据加载到内存,并在内存中建立一张哈希表。然后,将对于被驱动表的每一条记录依次对做哈希运算,将得到哈希值与内存中的驱动表的哈希值比较。这样只需要遍历一遍被驱动表,就可以完成联接操作。

跟BNL算法一样,如果join buffer 容量不足以一次性加载所有驱动表数据,则会分块加载一部分,这样被驱动表被扫描的次数,就是驱动表所分的块数。

如下图:

在这里插入图片描述

优缺点

BNLH算法的优势有两点,一是不需要被驱动表有索引。二是相比于BNL算法联接,在联接比较时,每条被驱动表的记录需要遍历join buffer中所有驱动表数据,而BHJ算法只需要比较一个哈希桶里的数据,这就大大减少了比较的数据量,从而提高了效率。

哈希算法虽好,但是也有两个弊端。一是该算法只能用于等值联接的场景,二是哈希计算本身也会增加一定的消耗。

适用场景

被驱动表联接字段不存在索引,且联接查询为等值查询,数据量特别大的场景。

相关配置

BHJ算法默认是关闭的,需要将join_cache_level设置为大于等于4的值,并显示地打开优化器的选项,设置过程如下:

set join_cache_join=4;

set optimizer_switch=‘join_cache_hashed=on’;

示例

在这里插入图片描述

执行计划中extra字段中有Using join buffer (flat, BNLH join),说明使用到了BNLH哈希算法。

总结

本文介绍了MYSQL中常见的多种联接算法,不同的算法有不同的适用场景。在SQL问题排查或者优化SQL语句时,可以根据不同的场景选用不同的算法,提高联接查询语句的执行效率。

其他:示例环境说明

1.上文示例中数据库版本为10.9.5-MariaDB-log。

2.上文示例中表结构为如下:

CREATE TABLE S (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

score int(11) DEFAULT 0,

PRIMARY KEY (id),

KEY score (score)

) ENGINE=InnoDB;

CREATE TABLE R (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

score int(11) DEFAULT 0,

PRIMARY KEY (id),

KEY score (score)

) ENGINE=InnoDB;

name varchar(255) DEFAULT NULL,

score int(11) DEFAULT 0,

PRIMARY KEY (id),

KEY score (score)

) ENGINE=InnoDB;

CREATE TABLE R (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

score int(11) DEFAULT 0,

PRIMARY KEY (id),

KEY score (score)

) ENGINE=InnoDB;

相关文章:

MYSQL表联接算法深入研究

在关系型数据库中,表联接是一种常见的操作,它使得我们可以根据不同的条件将多个表中的数据进行连接。而MySQL作为一种常用的关系型数据库,其表联接算法包括NLJ、BNL、BKA、BNLH等多种,在实际应用中选择不同的算法还需要考虑到数据…...

markdown中画图功能mermaid

mermaid Mermaid 是一种开源的可交互式的数据可视化库,它使用 Markdown 标记语言来生成图表和流程图。它通常用于生成网站或文档中的图表。Mermaid 不属于任何公司,而是一个由社区开发和维护的开源项目。 官方网站: https://mermaid-js.git…...

SCI论文丨机器学习与深度学习论文

目录 第一章、ChatGPT-4o使用方法与技巧 第二章、ChatGPT-4o辅助文献检索、总结与分析 第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计 第四章、ChatGPT-4o辅助学术论文开题与大纲生成 第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍 第六章、ChatGPT…...

linux系统编程(二)

1、fcntl #include <unistd.h> int fcntl(int fd, int cmd, ...)fcntl用于控制文件描述符&#xff0c;该系统调用有很多功能&#xff0c;功能用cmd来控制&#xff0c;fcntl后面的参数根据cmd来填充。 我们常用的cmd有&#xff1a; F_GETFL&#xff1a;获取文件状态标志…...

uni-app登录界面样式

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"screen"><view class"…...

windows C#-定义抽象属性

以下示例演示如何定义抽象属性。 抽象属性声明不提供属性访问器的实现&#xff0c;它声明该类支持属性&#xff0c;而将访问器实现留给派生类。 以下示例演示如何实现从基类继承抽象属性。 此示例由三个文件组成&#xff0c;其中每个文件都单独编译&#xff0c;产生的程序集由…...

ERROR: KeeperErrorCode = NoNode for /hbase/master

原因分析 通过上面的情景模拟&#xff0c;我们可以看到报错的原因在于zookeeper中出现问题&#xff0c;可能是zookeeper中的/hbase/master被删除&#xff0c;或者是在hbase集群启动之后重新安装了zookeeper&#xff0c;导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...

Deepin 23 踩坑记

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/12/deepin23-questions/&#xff09; Deepin 23 是由统信软件技术有限公司牵头开发一款开源 Linux 桌面操作系统&#xff08;参考链接1&#xff09;&#xff0c;从2022年发布预览版&#xff08;参考…...

mysql笔记——索引

索引 InnoDB采用了B树索引结构。 相比于二叉树&#xff0c;层级更少&#xff0c;搜索效率高。 B树中叶子节点和非叶节点都会存储数据&#xff0c;导致段页式存储中一页存储的键值减少&#xff0c;指针也会减少&#xff0c;要同样保存大量数据&#xff0c;只能增加树的高度&a…...

考研数据结构——简答题总结

数据结构的4种基本结构及特点&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a; 特点&#xff1a;数组是一种线性数据结构&#xff0c;使用连续的内存空间存储元素&#xff0c;可以通过索引直接访问任意位置的元素。优点&#xff1a;访问速度快&#xff0c;因为元…...

Qt Creator 里面设置MSVC 为 utf-8

在使用 Qt Creator 和 MSVC(Microsoft Visual C++)编译器进行开发时,我们可能会遇到中文乱码的问题。这通常是由于编码设置不正确导致的。 在 Qt Creator 中,你可以通过以下步骤设置默认编码为 UTF-8: 打开 Qt Creator,选择菜单栏中的“工具”(Tools) > “选项”(Opti…...

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…...

Helm安装Mysql8主从复制集群

目录 一、Helm安装 二、安装mysql 1、拉取镜像 2、修改配置文件 3、创建mysql-secret 4、安装 一、Helm安装 这里不再赘叙&#xff0c;具体安装请参考官网 Helm | 快速入门指南 二、安装mysql 1、拉取镜像 #添加仓库 helm repo add bitnami https://charts.bitnami.c…...

嵌入式基础:Linux C语言:Day7

重点&#xff1a; strlen()函数\strcpy()函数\strcat实现\strcmp()实现 数组的清空&#xff1a;bzero函数、memset函数 一、字符数组 <1> 概念 字符数组本质上就是一个数组&#xff0c;保存一个个字符&#xff0c;也一般用来保存字符串 字符串由多个字符组成的一个字符…...

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能&#xff0c;本文向你展示其数据可视化功能&#xff0c;并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分&#xff0c;无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…...

RAG与Embedding:现代NLP的核心技术

本篇文章简单梳理我在了解RAG以及Embedding技术时的想法&#xff0c;仅供参考 文章目录 1. 引言背景为什么要关注RAG与Embedding技术 2. 基础概念与原理2.1 什么是RAG (Retrieval-Augmented Generation)定义工作流程优点与适用场景 2.2 什么是Embedding定义作用 3. Embedding在…...

力扣每日一题 - 1812. 判断国际象棋棋盘中一个格子的颜色

题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给你一个坐标 coordinates &#xff0c;它是一个字符串&#xff0c;表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。2.如果所给格子的颜色是白色&#xff0c;请你返回 true&#xff0c;如果是黑色&#xff…...

Map 那些事儿

1. map 的基本结构 Go 的 map 是一种哈希表&#xff0c;其核心思想是通过哈希函数将键映射到某个位置&#xff08;桶&#xff09;以存储对应的值。它主要包含以下关键部分&#xff1a; •桶&#xff08;bucket&#xff09;&#xff1a;存储键值对的容器&#xff0c;map 中的元…...

GCP Case:MountKirk Games

游戏后端 根据游戏活动动态放大或缩小。 连接到托管的nos0l数据库服务。 运行定制的linux发行版。 游戏分析平台 根据游戏活动来扩大或缩小规模直接处理来自游戏服务器的传入数据。 处理由于移动网络缓慢而迟到的数据。 通过sql查询来访问至少10tb的历史数据 处理由用户…...

[创业之路-187]:《华为战略管理法-DSTE实战体系》-1-从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机

目录 一、UTStarcom&#xff08;UT斯达康&#xff09;的发展历程 1、创立与初期发展 2、快速成长与上市 3、技术创新与业务拓展 4、战略调整与持续发展 二、从UTStarcom的发展历程&#xff0c;如何辩证的看企业初期发展太顺利中的危机 1、企业初期发展的顺利表现 2、顺…...

高级数据结构-树状数组

介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…...

LeetCode279. 完全平方数(2024冬季每日一题 27)

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 …...

Scala 隐式转换

object test {//复习隐式转换&#xff1a;//隐式转换&#xff1a;编译器 偷偷地&#xff0c;自动地帮我们把一种数据转换为另一种类型//例如&#xff1a;int --> double//它有失败的时候&#xff08;double --> int&#xff09;&#xff0c;有成功的时候//当它转换失败的…...

K8S命令部署后端(流水线全自动化部署)

前言 本文为链接: 云效流水线k8s半自动部署java&#xff08;保姆级&#xff09;的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…...

Ubuntu中配置交叉编译工具的三条命令的详细研究

关于该把下面的三条交叉编译配置语句加到哪里&#xff0c;详情见 https://blog.csdn.net/wenhao_ir/article/details/144326545 的第2点。 现在试解释下面三条交叉编译配置语句&#xff1a; export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$…...

【PyQt5教程 二】Qt Designer 信号与槽的使用方法及PyQt5基本小部件说明

目录 一、信号与槽机制&#xff1a; 二、信号与槽使用方法&#xff1a; &#xff08;1&#xff09;使用Qt Designer 的信号与槽编辑器&#xff1a; &#xff08;2&#xff09;使用固定语法直接建立信号槽连接&#xff1a; 三、PyQt小部件及其触发信号&#xff1a; &#x…...

编程语言中接口(Interface)介绍

编程语言中接口&#xff08;Interface&#xff09;介绍 在编程语言中&#xff0c;“接口”&#xff08;Interface&#xff09;是一种抽象类型&#xff0c;定义了一组方法&#xff08;和属性&#xff09;&#xff0c;但不包含其具体实现。接口通常用于规定类必须实现的行为&…...

算法学习之贪心算法

前言 记录一下&#xff0c;免得又又忘了 贪心算法 在刚接触的时候&#xff0c;我一直觉得贪心和动态规划有相似之处&#xff0c;但做过的题目看&#xff0c;贪心似乎不用迭代...

【jvm】垃圾回收的优点和原理

目录 1. 说明2. 优点3. 原理3.1 发现无用对象3.2 回收无用对象所占用的内存 4. 回收算法4.1 标记-清除算法4.2 复制算法4.3 标记-整理算法4.4 分代收集算法 1. 说明 1.JVM&#xff08;Java虚拟机&#xff09;垃圾回收是Java语言的一大特性&#xff0c;它自动管理内存&#xff…...

YOLO系列发展历程:从YOLOv1到YOLO11,目标检测技术的革新与突破

文章目录 前言一、YOLOv1&#xff1a;单阶段目标检测的开端二、YOLOv2&#xff1a;更精准的实时检测三、YOLOv3&#xff1a;阶梯特征融合四、YOLOv4&#xff1a;性能和速度的新平衡五、YOLOv5&#xff1a;易用性和扩展性的加强六、YOLOv6&#xff1a;工业部署的利器七、YOLOv7&…...