【MySQL】数据库开发技术:内外连接与表的索引穿透深度解析

        前言:本节内容主要讲解表的内连和外连以及索引的一部分。 注意: 索引是很重要的知识点。务必学习!!本节将会主要谈一谈什么是索引,如何理解索引。 以及怎么理解MySQL与磁盘的关系。 下面友友们开始学习吧!

        ps:本节内容友友们只要想学习mysql都可以观看哦!!

目录

表的内连和外连接

内连接

外连接

左连接

右连接

索引

认识磁盘

MySQL与磁盘交互基本单位

建立共识

索引的理解


表的内连和外连接

内连接

        内连接实际就是利用where子句对两种表形成的结果进行筛选。 连接是在from中。 以前学习的笛卡尔积实际上就是今天的内连接。 笛卡尔积和where判断,就叫做内连接。 

        下面来看一个内连接的案例:

找出SMITH的部门名称和部门编号

select ename, dname from emp inner join dept on emp.deptno = dept.deptno where ename = 'SMITH';

外连接

左连接

        除了内连接, 就是外连接, 我们想让左侧的表, 完全显示。 右侧的表如果配不上, 就去掉。 左外连接的语法和内连接的语法一摸一样, 只不过是把left替换了inner。

        现在做一下示例:

        查询所有学生的成绩, 如果这个学生没有成绩, 也要将学生的个人信息显示出来:

create table stu(id int, name varchar(30));
insert into stu values(1, 'jack'), (2, 'kity'), (4, 'nono');
create table exam(id int, grade int);
insert into exam values(1, 56), (2, 76), (11, 8);

        现在我们进行左连接查询。 我们上面的表中学生有三个。 同时成绩也有三个。 但是三个成绩的最后一个成绩的学号并不是上面三个学生里面的任何一个人。那么, 我们左连接查询:

select * from stu left join exam on stu.id = exam.id;

        我们会发现, 即便我们的nono没有对应的成绩, 在第二张表中没有他, 他也被打印出来了。所以, 我们就能发现, 左连接就是,这个stu.id  = exam.id的条件, 更偏向于stu表。 

右连接

        其实左连接和右连接是一样的。 所以, 我们就可以做这个案例:

        对stu表和exam表进行联合查询, 把所有的成绩都显示出来, 即使这个成绩没有学生与它对应, 也要显示出来。

select * from stu right join exam on stu.id = exam.id;

        其实和左连接差不多的。

        以上就是内外链接的所有内容。 其实对于内连接来说, 就是判断条件时, 两张表是公平的。 对于左连接来说, 判断条件时, 偏向左表;对于右连接来说, 判断条件时, 偏向右表。

索引

        索引是为了提高数据库的读取速度的。 我们所有的mysql的CURD操作都是在mysql的内存中进行, mysql在启动的时候会在内存中开辟一大块空间, 然后将数据库操作体现在内存里。 最后在合适的时候将数据刷新到外设。 

        我们首先要知道,MySQL的服务器, 本质是在内存中的, 所有的数据库的CURD操作, 全部都是在内存中进行的!——所以,索引也是如此。 

        我们还要知道, 提高算法效率的因素无非就是两个:

  •         1、组织数据的方式。
  •         2、算法本身。

        所以, 这个索引一定是某种数据结构。

        其实对于我们数据库里每一个表, 在系统下都对应的就是一个文件。文件都需要在磁盘上保存, 未来的数据在盘片上的一个一个小格子,也就是扇区当中。

认识磁盘

        认识数据库, 我们就必须要认识一下磁盘。 数据库的数据其实本质上就是保存在磁盘上。 和磁盘文件如出一辙,同样是保存在磁盘上的一个一个小格子上面,即扇区并且, 对于这一个一个的小格子, 其实就是512字节, 如今大都是4kb。具体的磁盘是什么样子的, 博主已经做过讲解, 下面是文章连接:linux基础IO——文件系统——学习硬件:磁盘_linux 逻辑盘 文件系统-CSDN博客

        这里需要强调的是, 我们之前学习文件系统, 它的读取基本单位, 不是扇区,而是数据块。所以,系统读取磁盘, 是以块为单位的, 基本单位是4kb。

MySQL与磁盘交互基本单位

        MySQL之下并不直接是硬件, 而是操作系统。

        站在mysql的角度, 他认为与磁盘是以16kb进行交互, 但是mysql要经过OS, OS再与磁盘进行交互。 而OS与磁盘交互数据的大小为4kb。 

        所以, 在未来我们mysql要通过OS与磁盘交互, mysql一次就是操作16kb, 转化到OS和磁盘就是进行四次4kb的交互。 所以, 在mysql看来, 他不管, 他就是write, 操作系统就是必须在内部的文件缓冲区找到4个块, 然后四次交互将数据刷新到磁盘中。 同理, 未来mysql从磁盘中读数据, 就是要让OS读取四个快的数据,然后mysql读取数据read一次性读取16kb。 而对应的OS与磁盘之间就使用fsync系统调用进行交互。 

        mysql的这个16kb是mysql进行数据交互的基本单位, 这个基本单位就叫做page。

建立共识

        首先, mysql中的数据文件, 是以page为单位保存在磁盘中的。

        mysql的CURD操作, 都需要通过计算, 找到对应的插入位置, 或者找到对应要修改或者查询的的数据。

        而只要涉及到计算, 就必须有cpu参与, 而cpu参与, 就一定要让数据先移动到内存当中, 所以我们对应的磁盘当中的表当中的操作, 需要CURD操作的,就必须要先将表搬到OS内存中, 再从内存搬到mysql自己的缓冲区里面。 在自己的缓冲区里面用mysql自己的代码进行增删查改。而这个搬运过程里面搬运一次是4kb。 

        为了更好的搬运, 更好的提高搬运的速度。mysql服务器在内存中运行的时候,在服务器内部, 就申请了被称为Buffer Pool的大内存空间,来进行各种缓存。 其实就是很大的内存空间, 来和磁盘数据进行IO交互。 本质上就是减少系统和磁盘IO的消耗

索引的理解

        我们向一个具有主键的表中, 乱序插入数据。为什么会发现这些数据会自动排序?这些是系统默认做的排序。 如果一个表中以整数为主键, 那么他就会按照主键的类型进行排序。 

        如何理解mysql中page的概念呢?mysql内部, 一定需要并且会存在大量的page, 也就决定了mysql必须将多个同时存在的page管理起来!要管理所有的mysql内的page, 需要先描述,再组织。

        所以,不要简单的将page认为是一个内存块。 page内部也必须写入对应的管理信息!!!

struct page
{struct page* next;struct page* prev;char buffer[NUM];
}; 

        16kb, new page, 将所有的page用'链表的形式管理起来 --- 在buffer pool 内部, 对mysql中的page进行了一个建模。

        现在回到为什么要自动排序?

        根据我们理解就是用来优化查询效率。 page的数据结构是链表, 链表的特点也就是删除快, 查询修改慢。 所以优化查询的效率是必须的。 在查询某条数据记录的过程中, 我们一定是将整个页也就是16kb加载到内存当中。 所以就能IO次数。 page和page之间是链式, page之间也是链式。 但是链表查询太慢了, 为了提高效率——就从两个角度进行考虑:1、page之间和page之内。

        所以就有了页目录。 我们知道, 对于一本书来说, 目录就是用来加速我们搜索书中信息的。而且, 目录也是占用纸张的。 所以, 目录就是一种空间换取时间的做法。 所以, 为什么我们musqld要对数据进行排序呢, 就是因为方便我们引入页目录, 因为只有数据的编号有序的, 我们的目录才能更快捷的查找找到对应的数据。 不仅仅是page内部的数据可以使用页目录, 如果page之间不适用页目录。 那么我们的page之间进行搜索的时间, 其实也是消耗大量时间的。所以,给我们的page之间也引入了页目录。

        整个页目录如何创建, 就是再创建一批page, 这个page什么数据都不存, 只保存它管理的page指针。 这个指针指向他所管理的page的第一数据的起始位置。

        可是如果我们的插入的数据非常多。 所以上级的页page也会非常多。 那么对于这些页目录page就也是要进行线序遍历。 所以,如果发生这种情况, 就要再从上层继续添加page。

        所以, 往后我们查询数据就自顶向下查询数据。而这, 就是我们所说的B+树。 所以, mysql内的数据索引, 统一使用的是b+树索引的。 未来我们的b+树只有叶子节点用next与prev指针将他们连接起来。 其他的层并没有使用叶子节点进行连接起来。 

        这里有一些细节:就是叶子节点保存数据, 路上节点没有。 即非叶子节点不要数据, 只要目录。 为什么非叶子节点不存数据, 可以存储更多的目录项。 目录页可以更多的管理叶子page。 也就意味着这棵树一定是一个矮胖的树!——即途径路上节点减少, 找到目标数据只需要更少的page。 也就是IO的次数更少, 就在IO的层面提高了效率。而路上节点减少就意味 大大提高所以了搜索效率。所以就从两个层面上整体的提高了搜索的效率。

——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab Simulink HDL Coder开发流程(三)— 验证从Simulink模型生成的HDL代码

验证从Simulink模型生成的HDL代码 一、什么是HDL Test Bench(测试台)二、简单的计数器模型三、验证方法四、生成HDL Test Bench生成VHDL Test Bench生成Verilog Test Bench代码 五、查看HDL Test Bench文件六、运行仿真和验证生成的HDL代码七、在目标设备…

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例) 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象…

基于SpringBoot的“招聘信息管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“招聘信息管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 企业招聘界面…

Linux高阶——1123—服务器基础服务器设备服务器基础能力

目录 1、服务器基础 1、服务器基本概述 2、服务器设计之初解决的问题 网络穿透 网络数据设备间的收发 3、服务器的类型C/S、B/S 2、服务器设备 将自己的服务器软件部署上线 3、代理服务器负载均衡,以及地址绑定方式 4、服务器的基础能力 1、服务器基础 1…

探索 Python 任务自动化的新境界:Invoke 库揭秘

文章目录 探索 Python 任务自动化的新境界:Invoke 库揭秘背景:为何选择 Invoke?什么是 Invoke?如何安装 Invoke?5个简单的库函数使用方法1. 定义任务2. 带参数的任务3. 运行 Shell 命令4. 任务参数化5. 列出任务 场景应…

docker部署nginx,并配置SSL证书

、拉取nginx镜像 docker pull nginx:latest 在此过程中会遇到网络的问题&#xff0c;导致镜像无法下载&#xff0c;这时候需要在服务器中配置下国内的镜像地址。下面包含近期最新的国内镜像&#xff0c;截至2024年11月27日&#xff1a; "https://<你的阿里云账号ID&…

使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』

使用NAS开启无纸化办公&#xff0c;Docker部署开源文档管理系统『Paperless-ngx』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于文案类的办公场景来说&#xff0c;手头堆放最多的可能就是各种文档文件&#xff0c;以及各种用过的打印废纸。 这么多年来&#xff0c;不管是领…

ES 基本使用与二次封装

概述 基本了解 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了对海量数据的快速全文搜索、结构化搜索和分析功能&#xff0c;是目前流行的大数据处理工具之一。主要特点即高效搜索、分布式存储、拓展性强 核心功能 全文搜索:…

矩阵的拼接

矩阵的拼接分为横向拼接和纵向拼接 注意&#xff1a;横向拼接要求两矩阵行数相同&#xff0c;纵向拼接要求两矩阵列数相同 h o r z c a t horzcat horzcat和 v e r t c a t vertcat vertcat函数 h o r z c a t ( a , b ) horzcat(a,b) horzcat(a,b)将 a a a和 b b b横向拼接&a…

【Qt】重写QComboBox下拉展示多列数据

需求 点击QComboBox时&#xff0c;下拉列表以多行多列的表格展示出来。 实现 直接上代码&#xff1a; #include <QComboBox> #include <QTableWidget> #include <QVBoxLayout> #include <QWidget> #include <QEvent> #include <QMouseEve…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一&#xff0c;可以表示为&#xff1a; P_n(x) p_0 p_1x p_2xn 其中&#xff0c;p_0, p_1, ..., p_n 是数域 F 中的数&#xff0c;n 是非负整数&#xff0c;x 是变量。 二、一元多项式的线性表表示 在计算机中&…

如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南

动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统中非常重要的一部分&#xff0c;它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时&#xff0c;可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法&am…

基于微信小程序的平价药房管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、医生、普通用户功能模块&#xff1a;用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型&#xff1a;SpringBoot&#xff0c;Vue&#xff0c;uniapp等测试环境…

鸿蒙ArkUI-X已更新适配API13啦

ArkUI-X 5.0.1 Release版配套OpenHarmony 5.0.1 Rlease&#xff0c;API 13&#xff0c;新增适配部分API 13接口支持跨平台&#xff1b;框架能力进一步完善&#xff0c;支持Android应用非压缩模式&#xff0c;支持Android Fragment对接跨平台。ACE Tools工具易用性提升&#xff…

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講&#xff1a;訓練不了人工智慧嗎&#xff1f;你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符&#xff0c;使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后&#xff0c;下拉到最后找到Miniconda3-latest前缀的文件&#xff0c;或者网页中直接搜索Miniconda3-latest&#xff0c;都可以找…

python控制鼠标,键盘,adb

python控制鼠标&#xff0c;键盘&#xff0c;adb 听说某系因为奖学金互相举报&#xff0c;好像拿不到要命一样。不禁想到几天前老墨偷走丁胖子的狗&#xff0c;被丁胖子逮到。他面对警察的问询面不改色坚持自我&#xff0c;反而是怒气冲冲的丁胖子被警察认为是偷狗贼。我觉得这…