初始MySQL数据库

为什么我们要学习 MySQL?作为全球最受欢迎的开源关系型数据库,MySQL 是后端开发、运维、数据分析岗位的必备核心技能。很多新手入门时,总会陷入概念混淆:分不清「物理服务器、操作系统、MySQL 服务、数据库、表」的边界,也搞不懂 MySQL 作为一个应用程序,到底是怎么和底层操作系统交互、怎么完成数据存储的。

本文就从最基础的概念出发,彻底拆解这些核心关系,同时基于基础课件补充海量底层原理和实操细节,帮你搭建完整、体系化的 MySQL 知识框架,既能应对日常开发实操,也能理解背后的底层逻辑。

1:为什么需要数据库

1:文件存储数据的核心痛点

  • 数据安全性无法保障普通文件没有权限隔离、加密校验、备份恢复机制,一旦文件被误删、磁盘损坏,数据会永久丢失;同时没有操作日志,无法追溯数据的修改记录。
  • 数据查询与管理效率极低想要从文件中筛选符合条件的数据,只能全文件扫描,百万级数据下查询耗时会达到秒级甚至分钟级;同时文件无法做关联查询、分组聚合、排序等复杂操作,完全无法满足业务的数据分析需求。
  • 无法支撑海量数据存储单文件的存储上限受文件系统限制,且无法做分布式扩展;面对 TB 级的业务数据,文件存储完全无法实现高效的分片、归档和管理。
  • 并发控制与数据一致性完全缺失多个程序同时修改同一个文件时,极易出现数据覆盖、内容错乱的问题;同时无法保证操作的原子性 ------ 比如转账操作,扣款成功但收款失败,文件无法实现回滚,会导致数据永久不一致。
  • 程序开发成本极高用文件存储数据,需要开发者手动实现数据解析、查询、并发控制、异常处理等所有逻辑,代码冗余度极高,且无法保证稳定性。

2:数据库的本质定义

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的数据集合。

而我们常说的 MySQL,全称是 MySQL 数据库管理系统(DBMS,Database Management System),是一个位于用户和操作系统之间的软件,用于创建、使用和维护数据库,对数据进行统一的管理和控制。

3:数据库解决的核心问题

数据库的诞生,就是为了一站式解决文件存储的所有痛点,核心能力包括:

  • 持久化存储:基于磁盘实现数据的永久保存,配套完善的备份、恢复、容灾机制;
  • 高效查询:基于索引实现毫秒级的数据检索,支持复杂的 SQL 查询、关联分析、聚合计算;
  • 并发控制:通过锁机制、事务隔离级别,解决多用户同时操作的数据一致性问题;
  • 事务保障:支持 ACID 特性,保证数据操作的原子性、一致性、隔离性、持久性;
  • 权限管理:精细化的用户权限控制,实现不同用户对不同数据的读写权限隔离;
  • 标准化操作:基于 SQL(结构化查询语言)实现统一的数据操作,降低开发和学习成本。

2:MySQL,数据库,操作系统,服务器的核心关系

1:区分定义

名词 精准定义
物理服务器 / 云服务器 承载所有软件运行的硬件实体,提供 CPU、内存、磁盘、网卡等核心硬件资源,是所有程序运行的物理底座
操作系统(OS) 安装在服务器上的系统软件,是硬件和应用程序之间的中间层,负责管理和调度服务器的硬件资源,为上层应用程序提供标准化的服务接口(内存分配、磁盘 IO、网络通信、进程调度等)
MySQL 服务实例(MySQL Server) 安装在操作系统上的一个应用程序,以守护进程(mysqld)的形式运行在操作系统上,对外提供数据管理服务,是数据库的核心管理程序。一个服务器上可以运行多个 MySQL 实例(不同端口)
数据库(Database) MySQL 实例管理的逻辑数据集合,是数据的顶层容器。一个 MySQL 实例可以管理多个数据库,通常一个业务系统对应一个独立的数据库,实现业务数据隔离
表(Table) 数据库中的逻辑存储单元,对应业务中的一个实体(比如用户、订单、商品),每个表有固定的字段结构,用于存储结构化的行数据
行数据(Row) 表中的最小数据单元,对应业务中的一条实体记录(比如一个用户、一笔订单)

2:层级关系的通俗类比

为了让你瞬间理解层级关系,我们用一个生活化的类比做映射:

  • 物理服务器 = 一栋实体商业大楼,提供了空间、电力、网络等基础硬件资源
  • 操作系统 = 大楼的物业,管理大楼的所有硬件,给入驻商户提供标准化的水电、安保、空间分配、设备维护服务
  • MySQL 服务实例 = 入驻大楼的大型连锁超市,是一个独立的经营主体,完全依赖物业提供的基础服务,同时对外提供自己专属的商品售卖(数据管理)服务
  • 数据库 = 超市里划分的独立仓库,比如生鲜仓、食品仓、日用品仓,每个仓库对应一个业务线,互相隔离
  • 表 = 仓库里的货架,每个货架对应一类商品,有固定的规格和分类
  • 行数据 = 货架上的每一件商品,有对应的属性(生产日期、价格、规格等)

整个层级的依赖关系是:行数据 → 表 → 数据库 → MySQL 服务实例 → 操作系统 → 物理服务器

3:MySQL和物理服务器的关系

1:CPU
  • CPU 是 MySQL 的计算核心,负责 SQL 语句的解析、优化、执行,事务处理,数据运算,并发连接的调度等。
    • 多核 CPU 可以提升 MySQL 的并发处理能力,应对多用户同时连接的场景;
    • CPU 的主频决定了单条 SQL 语句的执行速度,高频 CPU 更适合 OLTP(联机事务处理)场景。
2:内存

内存是 MySQL 的性能核心,MySQL 会把高频访问的数据和索引加载到内存中,避免每次查询都访问磁盘。

  • MySQL 的核心内存区域是 InnoDB 缓冲池(Buffer Pool),缓存了数据页和索引页,缓冲池越大,内存中能缓存的热数据越多,磁盘 IO 次数越少,性能越高;
  • 内存的带宽和延迟,直接决定了 MySQL 的数据读写速度,是比磁盘更核心的性能瓶颈。
3:磁盘
  • 磁盘是 MySQL 的持久化存储底座,所有的数据、日志、配置最终都会存储在磁盘上,磁盘的性能决定了 MySQL 数据写入和持久化的速度。
    • 机械硬盘(HDD)顺序读写性能尚可,但随机读写性能极差,只适合归档、备份场景;
    • 固态硬盘(SSD)随机读写性能是 HDD 的数百倍,是生产环境 MySQL 的标配,能大幅提升高并发写入场景的性能。
4:网卡

网卡负责 MySQL 客户端和服务端的网络通信,所有的 SQL 请求、数据返回都要通过网卡传输。

  • 高并发场景下,大量的数据查询会占用极高的网络带宽,千兆 / 万兆网卡是生产环境的标配;
  • 网卡的稳定性,直接决定了 MySQL 服务的可用性,网络抖动会导致连接超时、事务失败。

4:MySQL和操作系统的底层交互

MySQL 是一个完全运行在操作系统之上的用户态应用程序,它没有权限直接操作硬件,所有的硬件资源调用,都必须通过操作系统提供的系统调用实现。二者的底层交互,是新手必须理解的核心原理,我们分 6 个维度详细拆解:

1:进程和线程管理

MySQL 在操作系统中,以mysqld 守护进程的形式运行,是操作系统管理的一个普通用户进程。

  • 启动 MySQL 服务,本质上就是操作系统创建一个 mysqld 进程,为其分配进程资源,调度 CPU 执行进程的代码;
  • MySQL 采用多线程模型,mysqld 进程会创建多个工作线程(连接线程、IO 线程、锁监控线程等),操作系统负责为这些线程分配 CPU 时间片,调度线程在 CPU 核心上执行;
  • 操作系统的进程调度策略、CPU 亲和性配置,直接决定了 MySQL 线程的执行效率,高并发场景下,我们通常会把 MySQL 线程绑定到固定的 CPU 核心,避免线程频繁切换带来的性能损耗。
2:内存管理

MySQL 无法直接操作物理内存,所有的内存申请,都必须通过操作系统的内存管理系统实现。

  • 操作系统为每个进程提供了独立的虚拟地址空间,MySQL 的内存划分(全局内存:缓冲池、日志缓冲区;会话内存:连接缓冲区、排序缓冲区),都在这个虚拟地址空间内,由操作系统映射到物理内存;
  • MySQL 的缓冲池数据,会先缓存在操作系统的页缓存(Page Cache)中,再由操作系统刷入磁盘,二者形成了二级缓存;
  • 新手最容易踩的坑:如果把 MySQL 的缓冲池大小设置得超过物理内存的 70%,操作系统会把不常用的内存数据置换到 swap 分区(磁盘虚拟内存),导致 MySQL 的性能暴跌;极端情况下,内存占用过高会触发操作系统的 OOM 机制,直接杀掉 mysqld 进程,导致服务不可用。
3:文件系统与磁盘IO

MySQL 的所有数据,最终都以文件的形式存储在操作系统的文件系统中,所有的磁盘读写操作,都必须通过操作系统的 IO 系统调用实现。

  • 逻辑上的「库、表、行数据」,在物理上都对应操作系统中的文件:
    • 数据库:对应操作系统文件系统中的一个目录;
    • InnoDB 表(独享表空间):对应目录下的.ibd文件(存储数据和索引)和.frm文件(存储表结构);
    • MyISAM 表:对应.MYD文件(存储数据)、.MYI文件(存储索引)和.frm文件(存储表结构);
    • 事务日志、错误日志、慢查询日志等,都对应操作系统中的独立日志文件。
  • 操作系统的文件系统类型(XFS/EXT4)、IO 调度算法、块大小配置,直接决定了 MySQL 的 IO 性能:生产环境推荐使用 XFS 文件系统,SSD 磁盘使用 noop/kyber 调度算法,机械磁盘使用 deadline 调度算法;
  • MySQL 的刷盘操作,本质上是调用操作系统的fsync系统调用,强制把内存中的数据刷入磁盘,保证数据持久化,这也是 MySQL 事务持久性的底层实现基础。
4:网络通信

MySQL 客户端和服务端的通信,完全基于操作系统的 TCP/IP 协议栈实现。

  • MySQL 服务启动时,会向操作系统申请监听 3306 端口(默认),操作系统的内核会维护这个端口的监听状态,处理客户端的 TCP 连接请求;
  • 客户端执行mysql -h 127.0.0.1 -P 3306 -u root -p命令,本质上是通过操作系统的 TCP/IP 协议栈,与 MySQL 服务端完成三次握手,建立 TCP 连接;
  • 所有的 SQL 请求、结果返回,都通过这个 TCP 连接传输,操作系统负责数据包的封装、传输、解包、重传;
  • 操作系统的内核网络参数(比如tcp_tw_reusetcp_max_syn_backlogsomaxconn),直接决定了 MySQL 的最大并发连接数和连接稳定性,高并发场景下需要针对性优化。
5:权限管理

MySQL 的运行,完全依赖操作系统的权限体系,操作系统是 MySQL 安全的第一道防线。

  • MySQL 服务必须以一个操作系统的普通用户(通常是 mysql 用户)运行,不能用 root 用户运行,避免被黑客攻击后获取服务器的最高权限;
  • MySQL 的数据文件和日志文件,必须设置严格的操作系统文件权限,只有 mysql 用户有读写权限,其他用户无任何权限,避免数据被非法访问和篡改;
  • 操作系统的防火墙(firewalld/iptables),负责控制 3306 端口的访问权限,只允许信任的客户端 IP 访问,是 MySQL 的网络安全屏障;
  • 操作系统的 SELinux/AppArmor 安全模块,会限制 mysqld 进程的行为,避免进程执行非法操作,提升服务的安全性。
6:信号处理

操作系统通过信号,向 MySQL 进程传递状态指令,MySQL 进程会根据信号类型执行对应的操作:

  • SIGTERM:正常终止信号,MySQL 收到后会完成事务提交、关闭连接、刷盘等操作,正常退出;
  • SIGKILL:强制终止信号,操作系统会直接杀掉 mysqld 进程,MySQL 不会做任何收尾操作,可能导致数据损坏,生产环境严禁使用;
  • SIGHUP:重载配置信号,MySQL 收到后会重新加载配置文件,无需重启服务。

5:逻辑映射

理解了底层硬件和操作系统的交互,我们再回到 MySQL 本身,把实例、库、表的逻辑关系和物理映射讲透。

1:一对多的层级关系
  • 1 个物理服务器 → 可以运行多个操作系统(虚拟机),也可以运行 1 个操作系统;
  • 1 个操作系统 → 可以运行多个 MySQL 服务实例(不同端口,比如 3306、3307);
  • 1 个 MySQL 服务实例 → 可以管理多个数据库(比如 shop、oa、crm);
  • 1 个数据库 → 可以创建多个表(比如 user、order、product);
  • 1 个表 → 可以存储多条行数据。
2:逻辑与物理的对应

当我们执行create database shop;时,MySQL 会在操作系统的数据目录下,创建一个名为shop的目录;当我们在 shop 库中执行create table user(...);时,MySQL 会在shop目录下,创建 user 表对应的物理文件(user.ibd、user.frm);当我们向 user 表插入数据时,MySQL 会把数据写入 user.ibd 文件中,同时记录事务日志,最终由操作系统刷入磁盘持久化。

3:MySQL核心架构和SQL执行流程

1:MySQL核心架构

MySQL 的架构整体分为三层:客户端层、Server 层、存储引擎层,核心特点是插件式架构,存储引擎可插拔,不同的存储引擎提供不同的存储能力。

1:客户端层

负责与 MySQL 服务端建立连接,发送 SQL 请求,接收返回结果,包括:

  • 原生 MySQL 客户端、Navicat/DBeaver 等图形化客户端;
  • 开发语言的数据库驱动(JDBC、ODBC、Python 的 pymysql 等);
  • 负责连接处理、身份认证、权限校验。
2:server层

MySQL 的核心层,所有跨存储引擎的能力都在这一层实现,包括 SQL 解析、优化、执行,内置函数,事务管理,视图、存储过程等,核心组件如下:

  1. 连接器:负责与客户端建立 TCP 连接,完成身份认证、权限校验,管理连接的生命周期;
  2. 查询缓存:缓存 SQL 语句的查询结果,MySQL 8.0 已彻底移除(命中率极低,表更新会清空所有缓存);
  3. 解析器:对 SQL 语句进行词法解析和语法解析,生成语法树,校验 SQL 的语法是否正确;
  4. 优化器:对 SQL 语句进行执行计划优化,选择最优的索引,决定表的连接顺序,生成最终的执行计划;
  5. 执行器:根据优化器生成的执行计划,调用存储引擎的接口,执行 SQL 语句,返回查询结果。
3:存储引擎层

负责 MySQL 的数据存储和读取,是 MySQL 的底层数据存取组件,Server 层通过统一的存储引擎接口与存储引擎交互。

  • 存储引擎直接与操作系统的文件系统交互,负责数据的持久化、索引管理、事务实现、锁控制;
  • 不同的存储引擎有不同的特性,最常用的是 InnoDB,MySQL 5.5 之后成为默认存储引擎。

2:一条SQL语句的完整执行生命周期

理解了架构,我们就能搞懂一条select * from user where id = 1;的完整执行流程:

  • 客户端与连接器建立 TCP 连接,完成身份认证和权限校验;
  • 连接器校验用户有查询 user 表的权限,将连接交给执行器;
  • 解析器对 SQL 语句进行词法和语法解析,识别出这是一条查询语句,校验表名、字段名是否存在,语法是否正确,生成语法树;
  • 优化器根据语法树,选择最优的执行计划:id 是主键,选择主键索引查询;
  • 执行器根据执行计划,调用 InnoDB 存储引擎的接口,执行查询操作;
  • 存储引擎通过索引找到 id=1 的数据行,返回给执行器;
  • 执行器将结果返回给客户端,完成一次 SQL 查询。

3:SQL语言的分类与核心指令

分类 全称 中文名称 核心作用 代表指令
DDL Data Definition Language 数据定义语言 维护数据的存储结构(库、表、索引) create、drop、alter、truncate
DML Data Manipulation Language 数据操纵语言 对表中的数据进行增删改操作 insert、update、delete
DQL Data Query Language 数据查询语言 对表中的数据进行查询操作 select(核心中的核心)
DCL Data Control Language 数据控制语言 负责权限管理和用户管理 grant、revoke、create user、drop user
TCL Transaction Control Language 事务控制语言 负责事务管理和控制 commit、rollback、savepoint

4:MySQL引擎

1:什么是存储引擎

存储引擎是数据库管理系统中,负责数据存储、索引建立、数据查询、数据更新的底层技术实现。MySQL 的核心优势就是插件式存储引擎,支持多种存储引擎,我们可以根据业务场景,选择最适合的存储引擎,这也是 MySQL 能适配多种业务场景的核心原因。

查看 MySQL 支持的所有存储引擎,执行命令:

show engines;

2:主流引擎对比

特性 InnoDB MyISAM Memory SQLite
事务支持 支持(核心特性) 不支持 不支持 支持
锁粒度 行级锁(高并发场景优势极大) 表级锁 表级锁 行级锁
MVCC 多版本并发控制 支持 不支持 不支持 不支持
聚簇索引 支持 不支持 不支持 不支持
外键约束 支持 不支持 不支持 支持
崩溃恢复 支持( crash-safe,核心特性) 不支持,极易数据损坏 不支持,数据存在内存中 支持
全文索引 支持(5.6 + 版本) 支持 不支持 不支持
存储介质 磁盘 磁盘 内存 磁盘文件
适用场景 生产环境默认,OLTP 事务场景、高并发读写、电商、金融等核心业务 只读场景、静态数据、归档数据,已基本被淘汰 临时表、缓存表、高频访问的静态小表 嵌入式设备、移动端、单机小型应用
相关推荐
2403_883261091 小时前
CSS如何避免浮动元素换行_计算所有浮动元素的总宽度不超过父容器宽度
jvm·数据库·python
NineData1 小时前
NineData:AGI 数据时代,从 “人管” 到 “智理” 的范式跃迁
数据库·人工智能·oracle·agi·数据库管理工具·ninedata·数据库迁移工具
m0_609160491 小时前
Vue 中对象键名重复导致数据被覆盖的原理与解决方案
jvm·数据库·python
2401_880071401 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
Irissgwe1 小时前
redis之哨兵(Sentinel)
数据库·redis·sentinel·主从复制·哨兵
Gauss松鼠会1 小时前
浅谈GaussDB (DWS)技术【玩转PB级数仓GaussDB(DWS)】
数据库·经验分享·sql·数据库开发·gaussdb·经验总结
2401_831419441 小时前
如何正确解析含 HTML 实体的 XML 字符串并渲染为 HTML 表格
jvm·数据库·python
彳亍1012 小时前
如何排查Oracle客户端连接慢_DNS解析超时与sqlnet配置优化
jvm·数据库·python
2301_781571422 小时前
如何在 React Native 中高效缓存视频并使用 expo-av 播放
jvm·数据库·python