深入浅出MySQL:概述与体系结构解析

目录

    • 1. 初识MySQL
      • 1.1. 数据库
        • 1.1.1. OLTP(联机事务处理)
        • 1.1.2. OLAP(联机分析处理)
    • 2. SQL
      • 2.1. 定义
      • 2.2. DQL(数据查询语言)
      • 2.3. DML(数据操纵语言)
      • 2.4. DDL(数据定义语言)
      • 2.5. DCL(数据控制语言)
      • 2.6. TCL(事务控制语言)
    • 3. 数据库术语
    • 4. MySQL体系结构
      • 4.1. 连接器
      • 4.2. MySQL内部连接池
        • 4.2.1 线程模型
        • 4.2.2. 主线程
        • 4.2.3. 连接线程
        • 4.2.4. MySQL的线程模型优化
      • 4.3. 管理服务和工具组件
      • 4.4. SQL接口
      • 4.5. 查询解析器
      • 4.6. 查询优化器
      • 4.7. 缓冲组件
    • 5. 数据库设计三范式及反范式
      • 5.1. 空间和时间的关系
        • 5.1.1. 三范式目的
        • 5.1.2. 三范式内容
        • 5.1.3. 反范式
      • 5.2. 三范式与反范式的权衡
    • 6. 怎么执行一条SELECT语句
      • 6.1. 连接器
        • 6.1.1. 接收连接
        • 6.1.2. 管理连接
        • 6.1.3. 校验用户信息
      • 6.2. 查询缓存
        • 6.2.1. 功能
        • 6.2.2. 工作原理
      • 6.3. 分析器
        • 6.3.1. 词法分析
        • 6.3.2. 语法分析
      • 6.4. 优化器
        • 6.4.1. 制定执行计划
        • 6.4.2. 选择最优索引
        • 6.4.3. 最小化执行成本
      • 6.5. 执行器
        • 6.5.1. 获取数据
        • 6.5.2. 返回结果
      • 参考

1. 初识MySQL

1.1. 数据库

数据库是按照一定的数据模型组织、存储和管理数据的集合。数据库系统可以分为不同类型,主要包括OLTP和OLAP。

1.1.1. OLTP(联机事务处理)

OLTP(Online Transaction Processing)主要用于处理大量的短事务,如插入、更新和删除操作。其特点包括:

  • 高并发:支持大量用户同时操作。
  • 事务性:确保数据的一致性和完整性。
  • 实时性:快速响应用户请求。
  • 应用场景:电商平台、银行系统、在线订票等。
1.1.2. OLAP(联机分析处理)

OLAP(Online Analytical Processing)主要用于复杂的查询和数据分析。其特点包括:

  • 复杂查询:支持多维度、多层次的数据分析。
  • 大数据量:处理和分析海量数据。
  • 数据仓库:通常建立在数据仓库基础上。
  • 应用场景:商业智能、市场分析、数据挖掘等。

2. SQL

SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言。SQL包括多个子语言,每个子语言负责不同的功能。

2.1. 定义

SQL是一种用于与数据库进行通信的语言,支持数据的查询、更新、插入和删除等操作。它同时支持数据库对象的创建和管理,如表、视图和索引。

2.2. DQL(数据查询语言)

DQL主要用于查询数据,最常用的命令是SELECT

示例:

SELECT name, age FROM users WHERE age > 18;

2.3. DML(数据操纵语言)

DML用于数据的插入、更新和删除操作,包括INSERTUPDATEDELETE

示例:

INSERT INTO users (name, age) VALUES ('Alice', 30);
UPDATE users SET age = 31 WHERE name = 'Alice';
DELETE FROM users WHERE name = 'Alice';

2.4. DDL(数据定义语言)

DDL用于定义和管理数据库结构,包括CREATEALTERDROP等命令。

示例:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),age INT
);
ALTER TABLE users ADD COLUMN email VARCHAR(100);
DROP TABLE users;

2.5. DCL(数据控制语言)

DCL用于权限管理,包括GRANTREVOKE

示例:

GRANT SELECT, INSERT ON database_name.* TO 'user'@'localhost';
REVOKE INSERT ON database_name.* FROM 'user'@'localhost';

2.6. TCL(事务控制语言)

TCL用于管理数据库事务,包括BEGINCOMMITROLLBACK

示例:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;

3. 数据库术语

  • 表(Table):数据库中的基本存储单元,由行和列组成。
  • 行(Row):表中的一条记录,代表一个实体。
  • 列(Column):表中的一个字段,代表实体的属性。
  • 主键(Primary Key):唯一标识表中每一行的字段。
  • 外键(Foreign Key):用于关联两个表的字段,保证数据的参照完整性。
  • 索引(Index):用于加速数据查询的结构。
  • 视图(View):基于一个或多个表的虚拟表。
  • 事务(Transaction):一组操作的集合,要么全部执行,要么全部不执行。

4. MySQL体系结构

在这里插入图片描述

MySQL的体系结构包括多个组件,每个组件负责不同的功能。

4.1. 连接器

连接器负责管理客户端与MySQL服务器之间的连接。

  • 接收连接:处理客户端的连接请求。
  • 管理连接:维护和管理现有的连接,包括连接的生命周期。
  • 校验用户信息:验证用户的身份和权限,确保安全性。

4.2. MySQL内部连接池

内部连接池用于优化连接管理,减少连接的建立和关闭带来的开销。通过复用现有的连接,提高系统性能和资源利用率。

4.2.1 线程模型

在这里插入图片描述

在MySQL的架构中,多线程模型用于处理客户端的连接请求和SQL命令。以下是更具体的解释:

4.2.2. 主线程
  • 职责:主线程是MySQL服务器的核心,负责监听并接受来自客户端的连接请求。
  • 工作流程
    • 使用select()函数检测是否有新的连接请求。
    • 当有新连接到来时,通过accept()函数接收连接。
    • 每个新连接通过调用mysql_thread_create()函数创建一个新的工作线程,专门处理该客户端的请求。
    • 处理线程负责该连接的整个生命周期,包括通信和命令执行。
4.2.3. 连接线程
  • 职责:连接线程是MySQL中每个客户端连接对应的独立线程,负责与客户端的通信和命令执行。
  • 工作流程
    • 每个连接线程进入一个循环,等待客户端发送的数据并进行处理。
    • 循环中的read()函数读取客户端发送的SQL命令或其他请求。
    • do_command()函数执行相应的SQL命令或其他逻辑。
  • 优势
    • 这种线程模型允许MySQL同时处理多个客户端请求,提高了并发能力和吞吐量。
4.2.4. MySQL的线程模型优化
  • 多线程设计:适合需要同时处理大量并发连接的场景,提升系统的扩展性和响应速度。
  • 优化手段
    • 线程池:通过预先创建一定数量的线程,复用线程资源,减少线程创建和销毁的开销。
    • 连接池:管理和复用连接资源,提高资源利用率和系统性能。

4.3. 管理服务和工具组件

包括各种管理工具和服务,如:

  • MySQL Shell:命令行工具,用于管理和开发。
  • MySQL Workbench:图形化工具,用于数据库设计、管理和监控。
  • 备份与恢复工具:如mysqldumpmysqlpump等。

4.4. SQL接口

SQL接口是MySQL与用户交互的桥梁,负责接收和处理用户的SQL语句。它包括:

  • 客户端接口:通过TCP/IP、Unix套接字等协议与客户端通信。
  • 协议解析:解析客户端发送的SQL命令和请求。

4.5. 查询解析器

查询解析器负责将SQL语句解析成内部的执行计划。包括以下步骤:

  • 词法分析:将SQL语句拆分成标记(tokens)。
  • 语法分析:检查SQL语句的语法结构,生成语法树。
  • 语义分析:检查SQL语句的语义正确性,如表和列的存在性。

4.6. 查询优化器

查询优化器负责制定高效的执行计划,以最小的资源消耗完成查询。其主要功能包括:

  • 选择最优索引:根据查询条件选择合适的索引,提高查询速度。
  • 优化查询顺序:调整表的连接顺序,减少中间结果集的大小。
  • 成本估算:评估不同执行计划的成本,选择最低成本的计划。

4.7. 缓冲组件

缓冲组件用于缓存数据和索引,减少磁盘IO,提高查询性能。主要包括:

  • 缓冲池(Buffer Pool):缓存数据页,加快数据读取速度。
  • 查询缓存(已在8.0版本中移除):缓存查询结果,提高重复查询的响应速度。

5. 数据库设计三范式及反范式

数据库设计中的三范式(1NF、2NF、3NF)用于规范数据库结构,减少数据冗余,提高数据一致性。同时,反范式设计在特定情况下通过适度引入冗余来优化查询性能和满足特定需求。

5.1. 空间和时间的关系

在数据库设计中,空间和时间常常是相互制约的两个方面。三范式主要关注减少数据冗余(空间优化),而反范式则有时通过引入冗余来提高查询效率(时间优化)。

5.1.1. 三范式目的
  • 减少空间占用:通过规范化设计,消除数据冗余,减少存储空间的浪费。
  • 提高数据一致性:避免由于冗余数据带来的数据不一致问题。
  • 简化维护:减少数据更新时的复杂性,降低维护成本。
5.1.2. 三范式内容
  1. 第一范式(1NF)

    确保每个表的每一列都是原子的,不可再分割。即表中的每一列只包含单一值。

    示例:

    • 不符合1NF:

      IDNameHobbies
      1AliceReading, Swimming
    • 符合1NF:

      IDNameHobby
      1AliceReading
      1AliceSwimming
  2. 第二范式(2NF)

    在满足1NF的基础上,消除非主属性对主键的部分依赖。即每个非主属性必须完全依赖于主键。

    示例:

    • 不符合2NF:

      OrderIDProductIDProductNameQuantity
      1101Widget5

      ProductName仅依赖于ProductID,而非OrderIDProductID的组合主键。

    • 符合2NF:

      • 订单表:

        OrderIDProductIDQuantity
        11015
      • 产品表:

        ProductIDProductName
        101Widget
  3. 第三范式(3NF)

    在满足2NF的基础上,消除非主属性之间的传递依赖。即每个非主属性只依赖于主键,而不依赖于其他非主属性。

    示例:

    • 不符合3NF:

      EmployeeIDEmployeeNameDepartmentIDDepartmentName
      1BobD001Sales

      DepartmentName依赖于DepartmentID,而DepartmentID依赖于EmployeeID

    • 符合3NF:

      • 员工表:

        EmployeeIDEmployeeNameDepartmentID
        1BobD001
      • 部门表:

        DepartmentIDDepartmentName
        D001Sales
5.1.3. 反范式

反范式指在数据库设计中适度引入冗余,以提高查询效率或满足特定需求。尽管违反了范式,但在实际应用中有时为了性能或简化查询而采用反范式设计。

示例:

  • 在订单表中直接存储产品名称,而不是通过关联查询获取产品信息,以减少查询次数。

5.2. 三范式与反范式的权衡

在数据库设计过程中,设计师需要在三范式和反范式之间进行权衡,根据具体的应用场景和性能需求选择最合适的设计方案。

  • 采用三范式的优点:

    • 数据结构清晰,易于维护和扩展。
    • 减少数据冗余,提高数据一致性。
    • 简化数据更新操作,降低数据异常风险。
  • 采用反范式的优点:

    • 提高查询性能,减少复杂的联接操作。
    • 适应特定业务需求,优化常用查询路径。
    • 降低查询的复杂性,简化应用层逻辑。
  • 权衡考虑:

    • 性能需求:高并发和复杂查询场景可能更倾向于反范式设计。
    • 维护成本:频繁变更的数据结构适合三范式设计。
    • 数据一致性:需要严格数据一致性的应用应优先考虑三范式。

通过合理的设计,可以在三范式和反范式之间找到平衡点,既保证数据的规范性和一致性,又满足性能和业务需求。

6. 怎么执行一条SELECT语句

在这里插入图片描述

执行一条SELECT语句涉及多个步骤和组件,下面详细介绍其执行过程。

6.1. 连接器

6.1.1. 接收连接

MySQL服务器通过连接器接收来自客户端的连接请求。这些连接请求可以通过不同的协议(如TCP/IP、Unix套接字)进行。

6.1.2. 管理连接

连接器负责管理现有的连接,包括维护连接的生命周期、资源分配等。有效的连接管理能够提高系统的吞吐量和响应速度。

6.1.3. 校验用户信息

在建立连接时,连接器会验证用户的身份信息,包括用户名、密码和访问权限,确保只有授权用户才能访问数据库。

6.2. 查询缓存

注意:从MySQL 8.0版本开始,查询缓存已被移除。

6.2.1. 功能

查询缓存用于缓存SELECT语句的结果,当相同的查询再次执行时,直接返回缓存结果,避免重复计算。

6.2.2. 工作原理
  1. 缓存存储:查询结果以键值对的形式存储在缓存中。
  2. 命中缓存:如果查询在缓存中存在,直接返回结果。
  3. 未命中缓存:继续执行查询流程,生成新的查询结果并存入缓存。

6.3. 分析器

分析器负责将SQL语句解析为内部可执行的形式,主要包括:

6.3.1. 词法分析

将SQL语句拆分成基本的标记(tokens),如关键字、标识符、操作符等。

6.3.2. 语法分析

检查SQL语句的语法结构是否正确,并生成语法树(Parse Tree),用于后续的语义分析和优化。

6.4. 优化器

优化器负责生成高效的执行计划,优化查询性能。主要步骤包括:

6.4.1. 制定执行计划

根据语法树和数据库统计信息,生成多个可能的执行计划。

6.4.2. 选择最优索引

分析查询条件,选择最适合的索引,以减少扫描的数据量。

6.4.3. 最小化执行成本

评估各个执行计划的成本(如I/O操作、CPU使用),选择成本最低的执行计划。

6.5. 执行器

执行器根据优化器生成的执行计划,实际执行查询操作,主要包括:

6.5.1. 获取数据

从存储引擎中检索所需的数据,可能涉及读取磁盘或从缓冲池中获取数据页。

6.5.2. 返回结果

将查询结果组织成客户端可理解的格式,并通过连接器返回给客户端。

通过上述步骤,MySQL能够高效地处理和执行SELECT语句,确保数据的快速检索和一致性。了解MySQL的体系结构和执行流程,有助于优化数据库设计和提升系统性能。

参考

0voice · GitHub

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

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

相关文章

Python基于OpenCV的实时疲劳检测

2.检测方法 1)方法 与用于计算眨眼的传统图像处理方法不同,该方法通常涉及以下几种组合: 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间(表示眨眼)。 相反,眼睛长…

Python网络请求库requests的10个基本用法

大家好!今天我们要聊聊Python中非常实用的一个库——requests。这个库让发送HTTP请求变得超级简单。无论你是想抓取网页数据还是测试API接口,requests都能派上大用场。下面我们就一起来看看如何使用requests完成一些常见的任务。 引言 随着互联网技术的…

队列(数据结构)——C语言

目录 1.概念与结构 2.队列的实现 初始化QueueInit 申请新节点BuyNode 入队QueuePush 判断队为空QueueEmpty 出队QueuePop 读取队头数据QueueFront 读取队尾数据QueueBack 元素个数QueueSize 销毁队列QueueDestroy 3.整体代码 (文章中结点和节点是同一个意思) 1.概…

keil兼容C51和ARM,C251

三合一 C51,AEM,C251获取STC32的包 将 C51,AEM,C251安装到一块。 C51,AEM,C251 将三个软件分别下载到不同的文件夹KEIL,MDK,KEIL2里。 然后打开KEIL,MDK,KEIL2文件夹,复制KEIL文件夹里的C51和KEIL2文件夹里的C251的文件夹到MDK文件夹里。 打开KEIL和KEIL2文件夹里…

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…

运行kafka查看所有主题Topic报错zookeeper is not a recognized option

执行命令查看:./kafka-topics.sh --list --zookeeper localhost:2181 报错 zookeeper is not a recognized option joptsimple.UnrecognizedOptionException: zookeeper is not a recognized optionat joptsimple.OptionException.unrecognizedOption(OptionExcept…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析(input.getSplits(job)) 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

二、PyCharm基本设置

PyCharm基本设置 前言一、设置中文汉化二、设置代码字体颜色三、设置鼠标滚轮调整字体大小四、修改 PyCharm 运行内存4.1 方式一4.1 方式二 五、显示 PyCharm 运行时内存六、设置代码模版配置的参数有: 七、PyCharm设置背景图总结 前言 为了让我们的 PyCharm 更好用…

一家射频芯片企业终止,报告期持续亏损,高端产品占比不足

飞骧科技终止原因如下:飞骧科技从事的射频芯片行业如今竞争激烈,飞骧科技的产品主要应用于中低端手机,如摩托罗拉、传音,相比同行业上市公司已经退出的低集成度市场,相关产品展飞骧科技业务比重仍然不低。交易所质疑其…

【Matlab】基于Prandtl−Ishlinskii的迟滞模型-RLS辨识

PI模型 PI迟滞模型的输出公式: 代码记录 此代码为根据PI模型,已知输入(正弦函数幅值为3.5)、阈值以及权重值,利用matlab生成迟滞回线。 %% The Prandtl-Ishlinskii Hysteresis Model- %% 20241021 clc;clear; close…

数据结构与算法——Java实现 44.翻转二叉树

目录 226. 翻转二叉树 思路 代码 本地代码测试 不管前方的路有多苦 只要走的方向正确 不管多么崎岖不平 都比站在原地更接近幸福 —— 24.10.21 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输…

Unity AnimationClip详解(2)——动画数据的优化

【内存优化】 首先要意识到运行时和编辑时的区别,当运行时和编辑时所需的数据相差不大时,我们用同一套数据结构即可,当两者差异较多或者数据量很大时,需要有各自的数据结构,这意味着在打包或构建时需要将编辑时数据转…

【Linux探索学习】第七弹——Linux的工具(二):Linux下vim编辑器的使用详解

Linux的工具(一):【Linux探索学习】第六弹——Linux的工具(一):Ubuntu系统下的软件包管理器_ubuntu软件管理器-CSDN博客 前言: 在学习Linux之前,相信大家都或多或少的学习过一些计算…

微信小程序用开发工具在本地真机调试可以正常访问摄像头,发布了授权后却无法访问摄像头,解决方案

今天开发上线了一个拍照的微信小程序&#xff0c;用uniapp的Vue3开发的&#xff0c;调用的camera组件&#xff0c;相关代码如下&#xff1a; <!-- 微信小程序相机组件 --><view v-if"showCamera" class"camera-container"><camera :device…

Adobe Acrobat DC 打印PDF文件,没有打印出注释的解决方法

adobe acrobat在打印的时候&#xff0c;打印不出来注释内容&#xff08;之前一直可以&#xff0c;突然就不行&#xff09;&#xff0c;升级版本、嵌入字体等等都试过&#xff0c;也在Google找了半天和问了GPT也么找着办法。 无奈之下&#xff0c;自己通过印前检查&#xff0c;…

免费开源AI助手,颠覆你的数字生活体验

Apt Full作为一款开源且完全免费的软件&#xff0c;除了强大的自然语言处理能力&#xff0c;Apt Full还能够对图像和视频进行一系列复杂的AI增强处理&#xff0c;只需简单几步即可实现专业级的效果。 在图像处理方面&#xff0c;Apt Full提供了一套全面的AI工具&#xff0c;包…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

《YOLO目标检测》—— YOLO的简单介绍及Map评估指标

文章目录 一、简单概述二、YOLO中的Map指标1.定义与计算2.应用与意义3.注意事项 一、简单概述 YOLO&#xff08;You Only Look Once&#xff09;是一种目标检测算法&#xff0c;由Redmon等人在2016年提出。它的主要特点是速度快且准确性高&#xff0c;非常适合用于实时目标检测…

C# WebApi 接口测试工具:WebApiTestClient应用技术详解

目录 一、引言 二、WebApiTestClient介绍 1、特性 2、应用场景 三、WebApiTestClient具体使用 1、WebApi项目引入组件 2、如何使用组件 1、修改Api.cshtml文件 2、配置读取注释的xml路径 3、测试接口 四、总结 一、引言 由于最近项目需要开发WebApi接口&…

热更新解决方案2 —— Lua语法相关知识点

概述 开发环境搭建 Lua语法 1.第一个Lua程序 2.变量 print("******变量*******"); --lua当中的简单变量类型 -- nil number string boolean -- lua 中所有的变量声明 都不需要声明变量类型 它会自动的判断类型 -- 类似C# 中的var --lua中的一个变量 可以随便赋值 ——…