MySQL简解

news2024/11/17 11:28:22

文章目录

  • 1. MySQL框架
  • 2. 执行流程
    • 2.1. 连接池:
    • 2.2. SQL 前端(SEVER)
      • 2.2.0. 查询缓存
      • 2.2.1. SQL 接口
      • 2.2.2. SQL 解析器
      • 2.2.3. SQL 执行器
      • 2.2.4. INNODB 中读写操作
    • 2.3. 数据的保存形式
  • 3.其他重要概念
    • 3.1. 索引
      • 3.1.1. 简单概念
      • 3.1.2. 索引优化:
      • 1. Using filesort
      • 2. Using temporary
      • 3. Using index
      • 4. Using where
      • 5. Using index condition
      • 6. Using join buffer
      • 7. Impossible WHERE
      • 8. Select tables optimized away
    • 3.2. 页
      • 2. 读写效率
      • 3. 缓冲池管理
      • 4. 事务日志
      • 5. MVCC 支持
      • 6. 索引管理
      • 7. 空间管理
    • 3.2. 段
      • 功能和优势

1. MySQL框架

虽然大部分人都会只用 mysql,但是大部分对于 mysql 的大致框架都不慎了解,虽然我也使用了很久,但是对 mysql 的了解仅仅是皮毛,这里简单对 MySQL 的重要模块进行简单剖析。

在这里插入图片描述
这里以 INNODB 为视角,简单介绍一下 MySQL 的重要某块和简单执行流程。

2. 执行流程

2.1. 连接池:

首先我们需要知道,为什么 MySQL 要有连接池。

客户端一般通过 JDBC 之类的驱动和 Mysql 进行链接。
Mysql 里一般为重要数据,为了可靠性,mysql 和 客户端的交互一般通过 TCP 协议。

不过数据库的连接并非全双工,而是半双工

那么问题来了,TCP 一般要维护链接状态,客户端一般和 MYSQL 需要频繁的数据交互。

  1. 反复重新断开和重建连接的代价是比较高的,
  2. 同样 如果保活所有链接又不现实,因为活跃客户端并非很多。

又因为客户端相对不容易变化,所以 Mysql 使用连接池 作为一个客户端与 Mysql 连接数的一个权衡,作为提升连接效率的方案。

连接池核心参数如下,设计思路和线程池是有些类似的。

  • 最大连接数(Max Connections)

    • 这个参数指定了连接池中允许的最大活跃连接数。当连接池中的活跃连接达到此数值时,新的请求将等待,直到有可用连接。
  • 最小空闲连接数(Min Idle Connections)

    • 这是连接池中应保持空闲状态的最小连接数。连接池会尝试保持至少这么多的连接处于空闲状态,以备不时之需。
  • 初始化连接数(Initial Connections)

    • 启动连接池时,立即创建的连接数量。这可以帮助应用程序快速启动,避免在第一次请求时承受创建连接的延迟。

在 MYSQL 内部大概分为了两层,一层是 SEVER 层,核心是 解析器,优化器,执行器,相当于 MYSQL 的前端;
在这里插入图片描述
一层是,存储引擎,如 INNODB 和 MYSAM,相当于 MYSQL 的后端。
在这里插入图片描述

2.2. SQL 前端(SEVER)

2.2.0. 查询缓存

查询缓存,一般在进入 SQL 的第一步进行哈希查询,如果存在 该 SQL 的 key 就直接返回,不过 MYSQL 中未默认开启工这个功能,且在 8.0 后该功能已经被移除。

原因主要如下:

  1. 会造成过多性能浪费
  2. 有专业的redis去替代
  3. redis 的手动,一致性查询更加灵活

2.2.1. SQL 接口

SQL 接口是一种逻辑概念。MYSQL 为客户端提供了包括创建,修改 表,增删改查表等一系列功能。而这些暴露给客户端统一的进行 sql 操作的逻辑接口。

这些操作具体在进入MYSQL 会进行其他的加工操作。

2.2.2. SQL 解析器

  1. SQL 解析(Parsing)
  • 词法分析:此阶段主要将输入的 SQL 语句分解成一系列的令牌(tokens),例如关键字、操作符、标识符等。
  • 语法分析:解析器根据 MySQL 的语法规则检查 SQL 语句的结构是否正确。如果语法有误,将在这一步骤中抛出错误。
  1. 预处理(Preprocessing)
  • 在这一步,预处理器会进行一些额外的检查和转换。它会验证 SQL 语句中引用的数据库对象(如表和列)是否存在,以及用户是否有权执行该语句。预处理器还可能调整语句的结构,以便更有效地执行。
  1. 优化(Optimization)
  • 查询优化器:这是一个核心组件,它负责选择执行查询的最有效路径。优化器会考虑多种可能的查询执行计划,并根据成本估算模型选择一个预期成本最低的计划。

查询优化器通过成本模型(cost model)来估算不同查询执行计划的成本,从而选择最有效的执行方案。这个成本通常是基于估计的资源消耗来计算的,包括磁盘I/O、内存使用、CPU 使用和网络开销

  • 执行计划生成:优化器产生一个详细的步骤计划,称为执行计划,它详细说明了如何访问数据库中的数据(例如选择哪些索引,连接表的顺序等)

2.2.3. SQL 执行器

在这里插入图片描述

  1. 根据优化器提供的执行计划,执行引擎负责执行具体的数据库操作。这包括数据的读取、计算和最终的数据返回。
  2. 执行过程中,执行引擎通过存储引擎的Handler 与 之交互,存储引擎负责管理如何在磁盘上存储和检索数据。

2.2.4. INNODB 中读写操作

在 INNODB 中一般有读写两种原子操作。

在这里插入图片描述
写入操作一般复杂一些。
在这里插入图片描述
MySQL 的读写操作都是面向 Buffer Pool 的。

但是在写的时候一般有 Redo log 和 Undo log 的辅助。

一般在事务提交后未刷入数据页的故障需要重做,事务未提交的故障需要回滚。

  1. redo 日志简解:

Redo log 日志是为了保证 buffer 区数据的意外恢复的,由于 Mysql 的数据处理都是面向 Buffer 的,由于是在内存中,没有持久化到硬盘中,这是不安全的,redo log 在意外停电等情况下用于buffer 区内容的恢复。


为什么 redo log 区需要刷盘? 那为什么不直接把buffer 区内容直接刷入数据页?
答: redo 日志的buffer 默认在内存也不够安全,需要通过刷盘策略刷入到硬盘。 由于redo log 日志保存是顺序保存,比直接随机刷入数据页要快

  1. undo 日志简解:

Undo 日志是事务回滚的关键,并且和 INNODB 的核心并发机制 MVCC 有紧密的关联。

MVCC 机制在这里插入图片描述

  1. 创建 Read View
    当事务开始执行读操作时,数据库会为这个事务创建一个 read view。这个视图包含了以下几个关键信息:
  • 活动事务列表:这个列表包含了在当前事务开始时所有活跃的事务的事务ID。
  • 最小活动事务ID(min-active trx id):所有未完成事务中最小的事务ID。
  • 创建时刻的事务ID(creator trx id):当前事务的ID。
  1. 读取数据时处理版本链

当事务尝试读取某个记录时,数据库系统会遵循以下步骤来确定应该返回哪个版本的数据:

  • 遍历版本链:每条记录可能有多个版本,每个版本由不同的事务在不同时间创建。系统会从最新版本开始,遍历这个记录的版本链。
  • 检查版本可见性:对于链中的每个版本,系统会检查创建该版本的事务ID(trx_id)。
    • 如果trx_id小于 read view 中的最小活动事务ID,并且创建该版本的事务已提交,则这个版本是可见的。
    • 如果trx_id属于 read view 中的活动事务列表,则该版本不可见,因为创建它的事务还未提交。
    • 如果trx_id等于当前事务的ID,这意味着当前事务自己修改了这条记录,所以这个版本是可见的。
  • 选择可见的最新版本:从版本链中选择最新的、对当前事务可见的版本作为读取结果。

在处理删除和插入操作时,版本链的处理会稍有不同。例如,如果一条记录被标记为删除,并且删除操作是在当前事务的 read view
创建之后发生的,则这条记录对当前事务不可见。

2.3. 数据的保存形式

以 INNODB 为例
在这里插入图片描述
.frm 文件

  • 用途.frm 文件用于存储表的结构信息。这包括表的定义,如字段名、数据类型、默认值以及其他表结构相关的元数据。
  • 特点
    • 每个表都有一个对应的 .frm 文件。
    • .frm 文件格式相对独立于存储引擎,这意味着无论表使用的是 InnoDB、MyISAM 或其他存储引擎,.frm 文件都是必需的。
    • 在 MySQL 5.7 及之前的版本中,.frm 文件是表结构存储的唯一方式。

.ibd 文件

  • 用途.ibd 文件是 InnoDB 存储引擎特有的文件,用于存储表的数据和索引。
  • 特点
    • .ibd 文件允许 InnoDB 实现表级别的物理文件存储,这种方式称为“文件-表空间”(file-per-table tablespace)。
    • 使用 .ibd 文件可以使得数据库备份、恢复、迁移以及维护操作更加灵活和高效。
    • innodb_file_per_table 配置选项启用时,每个 InnoDB 表都会有一个独立的 .ibd 文件。如果该选项未启用,所有表的数据和索引将存储在共享的表空间中,通常是 ibdata1 文件。
    • .ibd 文件支持高级功能,如压缩、行格式选择等。

MySQL 8.0 及以后的变化

从 MySQL 8.0 开始,.frm 文件被淘汰,表的结构信息改由数据字典管理,这是一个集中在 InnoDB
引擎内部的系统表集合。这个变化意味着在最新版本的 MySQL
中,表的定义信息不再存储在独立的文件中,而是直接嵌入到数据库引擎的内部结构中。这样的变化带来了更好的性能和更简单的管理。

3.其他重要概念

3.1. 索引

3.1.1. 简单概念

索引可谓是重中之重,在面试中为常问考点。在 INNODB 中索引的数据结构是 B+ 树,一个类似二叉排序树的,一个节点包含更多数据的二叉树。

在这里插入图片描述
由于 B+ 树的特性,在 MySQL 中,索引的使用遵循左前缀匹配的原则。

3.1.2. 索引优化:

tyoe类型

  1. system
  • 含义:表仅有一行(系统表)。这是可能的最优 type,因为 MySQL 实际上把整个表转换为一个常数。
  1. const
  • 含义:通过索引一次性查找一行数据。这通常用于比较主键或唯一索引的查询。因为只返回一行数据,所以效率非常高。
  1. eq_ref
  • 含义:在 JOIN 操作中,对于每个索引键,表中只有一行与之匹配。这通常发生在使用主键或唯一索引作为连接条件时。
  1. ref
  • 含义:这是 JOIN 类型的一种,它返回匹配某个单个值的所有行。ref 可以用于非唯一索引,或者是唯一索引的非唯一部分。
  1. fulltext
  • 含义:查询使用了全文索引。
  1. ref_or_null
  • 含义:这个类型类似于 ref,但 MySQL 会额外搜索包含 NULL 值的行。这在处理包含 NULL 值的联合查询中特别有用。
  1. index_merge
  • 含义:这种类型表示查询使用了两个或更多的索引合并策略。MySQL 会搜索几个索引,并使用索引合并的方法来生成结果集。
  1. unique_subquery
  • 含义:这种类型用在 IN 查询中,其中子查询返回不重复的值,通常涉及到主键或唯一索引。
  1. index_subquery
  • 含义:这种类型也用在 IN 查询中,但子查询可以返回重复的值。使用索引来查找每个键值。
  1. range
  • 含义:MySQL 使用一个索引来检索给定范围的行,比如使用操作符 BETWEEN、<、>等。
  1. index
  • 含义:MySQL 将遍历整个索引来查找匹配的行。这比全表扫描要好,因为索引通常是压缩的,所以IO成本较低。
  1. ALL
  • 含义:全表扫描,MySQL 将遍历全表来找到匹配的行。这通常是最慢的一种类型,应该尽量避免。

EXTRA 关键字

1. Using filesort

  • 含义:MySQL 需要进行外部排序来解决查询,常见于 ORDER BY 操作,表明索引没有被用于排序。
  • 优化策略:尝试调整索引以覆盖排序和查询条件,或重新设计查询以利用索引进行排序。

2. Using temporary

  • 含义:执行查询时,MySQL 需要创建一个临时表,通常在执行复杂的 JOIN、排序或者子查询时发生。
  • 优化策略:优化查询逻辑,减少需要使用临时表的操作。例如,简化 SELECT 子句中的表达式,或调整 JOIN 的顺序以减少处理的数据量。

3. Using index

  • 含义:查询能够只通过索引来完成,没有读取表的其他部分,这是一个非常高效的访问方式。
  • 优化策略:这通常是一个良好的指标,表明查询已经很好地利用了索引。确保常用查询维持这种状态。

4. Using where

  • 含义:MySQL 在检索行后还需要进行额外的 WHERE 条件过滤。
  • 优化策略:尽可能地通过索引来满足 WHERE 条件,减少需要后处理的行数。

5. Using index condition

  • 含义:使用了索引条件推送(Index Condition Pushdown),这在 MySQL 5.6 及以后版本中提供,它允许更高效地使用索引来过滤记录。
  • 优化策略:此特性通常自动启用,确保你的 MySQL 版本支持此优化,并且索引适用于查询条件。

6. Using join buffer

  • 含义:用于 JOIN 操作,表明没有使用索引,MySQL 需要使用缓冲区来处理 JOIN
  • 优化策略:调整 JOIN 语句或增加适当的索引,以尽量避免使用大量的 JOIN 缓冲。

7. Impossible WHERE

  • 含义:WHERE 子句的条件永远不为真,查询不会返回任何结果。
  • 优化策略:检查逻辑错误,确保查询条件正确并能返回预期的结果。

8. Select tables optimized away

  • 含义:优化器识别出只需要从优化的表中读取很少的数据或无需实际访问表数据。
  • 优化策略:通常不需要进一步优化,这显示查询已经非常高效。

3.2. 页

在硬盘中一个磁盘块为4k,一个页通常为连续的4个磁盘块,在一次加载的时候加载一个页,由于是顺序读取一般情况下比较快,

  1. 数据存储组织
  • 存储结构:InnoDB 将数据存储在大小固定的页中,通常每页的大小为 16KB(虽然这个大小可以配置)。这种方式允许数据库高效地读取、写入和管理数据。

2. 读写效率

  • I/O 效率:通过以页为单位进行数据读写,数据库能够减少磁盘 I/O 操作的次数。因为即使需要访问的只是页中的少量数据,整个页的数据也会一次性被加载到内存中,这样对同一页面的后续访问不再需要磁盘 I/O。

3. 缓冲池管理

  • 缓冲池(Buffer Pool):InnoDB 使用缓冲池来缓存数据页和索引页,从而提高数据访问速度。这意味着频繁访问的数据可以保留在内存中,提高数据库的响应速度和整体性能。

4. 事务日志

  • Redo 日志:InnoDB 使用页作为 Redo 日志记录的基本单位。这意味着每次事务修改页内容时,修改的内容(或差异)被记录到 Redo 日志中。这有助于确保在数据库崩溃后能够恢复数据。

5. MVCC 支持

  • 多版本并发控制:InnoDB 页中存储了行的多个版本,支持 MVCC。这允许多个事务同时访问同一数据页的不同版本,从而支持无锁读取,提高并发性。

6. 索引管理

  • B+树索引:InnoDB 使用 B+树索引结构来加速数据访问。在这种结构中,索引数据也是按页组织的。索引的叶节点页直接包含或指向实际的数据页,而非叶节点页存储键值和指向子页的指针,从而支持快速数据查找和范围查询。

7. 空间管理

  • 表空间:InnoDB 将所有的页组织在表空间中,表空间可以是单个文件或多个文件,其中包括数据和索引页。这种组织方式为数据文件的管理和扩展提供了灵活性。

3.2. 段

段的概念允许数据库以更高层次的逻辑结构管理数据,而不是单纯依赖于物理存储细节。在 InnoDB 中,常见的段类型包括:

  • 数据段:存储表数据的页。
  • 索引段:存储索引数据的页,每个索引(如主键或二级索引)都会有自己的索引段。
  • 回滚段:存储用于事务回滚和多版本并发控制(MVCC)的旧数据。

功能和优势

逻辑上的段组织带来了几个关键优势:

  1. 性能优化:通过逻辑组织段,数据库能够更有效地管理数据和索引的存储,优化访问模式和查询性能。
  2. 数据管理:段使得数据和索引的管理变得更为灵活,例如,在增加或删除数据时,数据库可以更有效地分配和回收空间。
  3. 事务处理:段的使

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

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

相关文章

用这个方法,让你轻松从零搭建产品知识库

在市场竞争日益激烈的今天&#xff0c;一个系统化的产品知识库对于企业的重要性不言而喻。它不仅可以帮助团队成员快速掌握产品信息&#xff0c;提升服务效率&#xff0c;还能为客户提供及时准确的产品支持。那么&#xff0c;怎样才能从零开始&#xff0c;轻松搭建起一个合适的…

计算机服务器中了devicdata勒索病毒怎么处理,devicdata勒索病毒解密工具流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业离不开网络&#xff0c;通过网络可以开展各项工作业务&#xff0c;网络也为企业的生产运营提供各类极大便利&#xff0c;大大提高了生产效率&#xff0c;但网络在为企业提供便利的同时&#xff0c;也为企业的数据安全带…

html网页在展示时,监听网络是否断网,如果断网页面暂停点击响应

序言&#xff1a; 集合百家之所长&#xff0c;方著此篇文章&#xff0c;废话少说&#xff0c;直接上代码&#xff0c;找好你的测试网页&#xff0c;进行配置&#xff0c;然后复制粘贴代码&#xff0c;就可以了。 1.css文件内容 #newbody{display: none;width: 100%;height: 9…

Linux系统-服务器硬件及RAID配置

目录 一.服务器 1.服务器与普通计算机的区别 2.功能 3.分类&#xff08;按照产品形态分&#xff09; 4.架构&#xff08;按照指令集类型&#xff09; 5.相关指令 5.1.查看服务器CPU的信息 5.2.查看服务器内存的信息 二.RAID磁盘阵列&#xff08;Redundant Array …

2024.04.24记录所解决的问题

一解决了使用VM虚拟机作为dubbo-admin服务器提供者在浏览器访问失败问题 一开始在服务器上面即使运行了zookeeper和dubbo-admin容器都没有访问出dubbo-admin的界面管理器。查看了其他映射端口以及注册中心的地址等等其他参数&#xff0c;都不行&#xff0c;然后就一直没有去处…

基于小程序实现的查寝打卡系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

面试ssss

响应式布局 响应式布局是一种设计和开发网页的方法&#xff0c;使网页能够适应不同的设备和屏幕尺寸&#xff0c;提供更好的用户体验。它通过使用媒体查询&#xff08;Media Queries&#xff09;和弹性布局&#xff08;Flexbox&#xff09;等技术&#xff0c;根据设备的特性和…

【Django】django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

其中django后台manage.py入口程序报错&#xff0c;检索很多问题解决方案&#xff0c;这里记录下个人问题原因 1.django启动异常问题详情 django.core.exceptions.AppRegistryNotReady: Apps aren’t loaded yet. 2.问题原因 Python第三方包安装版本不一致或缺少依赖包&…

cdo 修改 calendar 为标准的格式

使用ncl脚本时出现警告&#xff1a;day_of_year: illegal calendar proleptic_gregorian 其原因是读取的降水nc文件是我手动合并生成&#xff0c;所以时间的calendar不是很标准&#xff0c;数据信息如下所示&#xff0c;可以发现Calendar是proleptic_gregorian&#xff0c;这…

互联网盲盒小程序模式,入局市场的渠道选择

近年来&#xff0c;盲盒吸引了无数的消费者&#xff0c;还打造了“万物皆可盲盒”的市场&#xff0c;成为了当下拥有巨大发展前景的行业之一&#xff01;当然&#xff0c;盲盒市场除了吸引消费者外&#xff0c;还获得了众多商家和创业者的青睐。 盲盒作为一种娱乐消费方式&…

C++ | Leetcode C++题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution { public:int trap(vector<int>& height) {int n height.size();if (n 0) {return 0;}vector<int> leftMax(n);leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] max(leftMax[i - 1], he…

linux 守护进程的实现

文章目录 1. 守护进程及实现步骤2. 使用fork 方式创建守护进程3. 使用daemon 函数创建 1. 守护进程及实现步骤 特点&#xff1a; 长期运行&#xff1a;守护进程是一种生存期很长的一种进程&#xff0c;它们一般在系统启动时开始运行&#xff0c;除非强行终止&#xff0c;否则…

《QT实用小工具·三十八》QT炫酷的菜单控件

1、概述 源码放在文章末尾 非常飘逸的 Qt 菜单控件&#xff0c;带有各种动画效果&#xff0c;用起来也十分方便。 无限层级&#xff0c;响应键盘、鼠标单独操作&#xff0c;支持单快捷键。 允许添加自定义 widget、layout&#xff0c;当做特殊的 QDialog 使用。 项目demo演示…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘&#xff0c;涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

配线架与交换机:了解差异和最佳用途

什么是配线架&#xff0c;它与交换机有何不同&#xff1f; 配线架是一种具有多个插孔的设备或单元&#xff0c;用于方便管理电缆连接。 它充当静态交换机&#xff0c;允许轻松连接或断开网络设备&#xff0c;并为所有电缆连接提供集中位置。 另一方面&#xff0c;Switch 是一种…

基于深度学习的车牌识别

如果你认为车牌只是车子的‘名字’&#xff0c;那么是时候让你见识一下&#xff0c;当科技赋予它‘超能力’时会发生什么&#xff1f; 上效果图&#xff1b; 这就是车牌识别的力量&#xff0c;下面是主函数代码&#xff1a; # -*- coding: UTF-8 -*- import argparse import …

为底图发愁? 这里有一份清爽又百搭的底图绘制方法!

图纸不够清爽美观&#xff1f; 图纸表达混乱&#xff0c;重点不够醒目&#xff1f; 图纸的颜色太难调了&#xff0c;怎么调都不满意&#xff1f; ...... 俗话说&#xff0c;好的底图是图纸成功的关键&#xff01; 绝大部分的图纸问题&#xff0c;都和底图有关&#xff01; …

【C语言__指针01__复习篇11】

目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义 8.1 指针的解引用 8.2 指针-整数 九、void*指针 十、const修饰变…

自己写的爬虫小案例

网址&#xff1a;aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …