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

【MySQL】SQL语句在MySQL中的执行过程?主要存储引擎区别?

MySQL SQL语句执行过程详解

作为面试官,我来详细剖析一条SQL语句在MySQL中的完整执行过程,这是每个后端开发者都应该掌握的核心知识。

一、连接阶段

  1. 建立连接
  • 客户端通过TCP/IP协议与MySQL服务器建立连接(默认3306端口)
  • 服务器验证用户名、密码和权限
  • 连接管理器创建线程处理该连接(线程池优化)
  1. 查询缓存(MySQL 8.0已移除)
  • 如果是SELECT语句,先检查查询缓存
  • 命中缓存则直接返回结果(缓存key是完整SQL)
  • 注意:表数据变更加粗样式会使相关缓存失效

二、解析与优化阶段

  1. 解析器处理
  • 词法分析:将SQL拆分为token(关键字、标识符等)
  • 语法分析:检查SQL是否符合语法规则
  • 生成解析树(语法树)
  1. 预处理器
  • 检查表和列是否存在
  • 检查权限
  • 视图展开等转换操作
  1. 查询优化器
  • 基于成本优化(CBO)选择最优执行计划加粗样式
  • 考虑因素:索引、表大小、JOIN顺序等
  • 生成执行计划(可通过EXPLAIN查看)

三、执行阶段

  1. 执行引擎处理
  • 调用存储引擎API执行计划
  • 不同存储引擎(如InnoDB)实现不同
  1. InnoDB引擎处理流程
  • 缓冲池(Buffer Pool)检查:首先检查所需数据页是否在内存
  • 磁盘读取:若不在缓冲池,从磁盘加载数据页到内存
  • 锁机制:根据隔离级别加锁(共享锁/排他锁)
  • 事务处理写入undo log(用于回滚)和redo log(用于恢复)
  • 返回结果:将结果集放入网络缓冲区

四、返回结果

  1. 结果返回客户端
  • 结果集通过网络协议返回
  • 客户端逐步接收并处理数据
  • 连接保持或关闭(取决于配置)

MySQL存储引擎区别详解

一、MySQL主要存储引擎

  1. InnoDB (MySQL 5.5+默认引擎)
  2. MyISAM (MySQL 5.5前默认引擎)
  3. MEMORY (内存引擎)
  4. ARCHIVE (归档引擎)
  5. CSV (CSV文件引擎)
  6. BLACKHOLE (黑洞引擎)
  7. FEDERATED (联邦引擎)
  8. MERGE (MyISAM集合引擎)

二、核心引擎对比(InnoDB vs MyISAM)

特性InnoDBMyISAM
事务支持支持ACID事务不支持
锁粒度行级锁表级锁
外键支持支持不支持
崩溃恢复有redo log保证无保证
MVCC支持多版本并发控制不支持
存储限制64TB256TB
缓存机制缓冲池缓存数据和索引只缓存索引
全文索引MySQL 5.6+支持支持
压缩表支持支持
适用场景OLTP、高并发写OLAP、读密集型、数据仓库

三、引擎特点

引自腾讯云 MySQL 的存储引擎有哪些?它们之间有什么区别?

  1. InnoDB
  • 事务支持:InnoDB 是默认的存储引擎,支持事务处理(ACID 属性)。
  • 行级锁:使用行级锁,适合高并发环境。
  • 外键支持:支持外键约束。
  • 崩溃恢复:具有自动崩溃恢复功能。
  • 性能:在读写混合加粗样式负载下表现良好。
  • 存储:数据存储在表空间中,支持表空间的动态扩展加粗样式
  1. MyISAM
  • 不支持事务:不支持事务处理。
  • 表级锁:使用表级锁,不适合高并发写操作。
  • 全文索引:支持全文索引,适合搜索引擎等应用。
  • 性能:在只读或读多写少的场景下性能较好。
  • 存储:数据存储在磁盘文件中,每个表对应一个 .MYD 文件(数据文件)和一个 .MYI 文件(索引文件)。
  1. Memory
  • 内存存储:数据存储在内存中,速度快但不持久。
  • 临时数据:适合存储临时数据,如缓存、中间结果等。
  • 不支持事务:不支持事务处理。
  • 表级锁:使用表级锁
  • 性能:在需要高速读取的场景下性能非常好。
  1. Archive
  • 压缩存储:数据以压缩格式存储,占用空间小。
  • 只读:主要用于归档和日志记录不支持更新操作。
  • 不支持索引:不支持索引,查询性能较差。
  • 性能:适合存储大量历史数据,节省存储空间。
  1. CSV
  • CSV 文件:数据存储在 CSV 文件中,可以直接用文本编辑器打开
  • 简单:适合简单的数据导入导出操作。
  • 不支持事务:不支持事务处理。
  • 性能:性能较低,不适合大规模数据操作。
  1. Blackhole
  • 黑洞存储:所有写入的数据都会被丢弃,不实际存储任何数据。
  • 日志记录:主要用于测试和日志记录
  • 性能:写操作非常快,因为数据实际上没有被存储。
  1. Federated
  • 远程表:允许访问其他 MySQL 服务器上的表,实现分布式数据库
  • 性能:性能受网络延迟影响较大。
  • 不支持事务:不支持事务处理。
  1. Merge
  • 合并多个表:可以将多个 MyISAM 表合并成一个逻辑表。
  • 性能:适合需要对多个表进行统一查询的场景。
  • 不支持事务:不支持事务处理。

https://github.com/0voice

http://www.xdnf.cn/news/25615.html

相关文章:

  • LLM做逻辑推理题 - 如何找出不标准的球?
  • kafka认证部署
  • LINUX419 更换仓库(没换成)find命令
  • 中间件--ClickHouse-11--部署示例(Linux宿主机部署,Docker容器部署)
  • Python实现对目标Word文档进行自动化排版【4万字精讲】(14)
  • 多道程序和多任务操作系统区别
  • 设计测试用例模板
  • 意志力的源头——AMCC(前部中扣带皮层)
  • 相机模型--CMOS和CCD的区别
  • 致远OA——数据回填表单
  • 【记录】服务器用命令开启端口号
  • sklearn基础教程
  • 数据结构实验7.2:二叉树的基本运算
  • Neovim插件深度解析:mcphub.nvim如何用MCP协议重构开发体验
  • WPF 点击按钮,显示隐藏另一个控件
  • C++高并发内存池ConcurrenMemoPool
  • Shell脚本-什么时候需要定义变量
  • 【Netty篇】ByteBuf 详解 (下)
  • 绕过UI的cooke和token的验证
  • 2025年最新版 Git和Github的绑定方法,以及通过Git提交文件至Github的具体流程(详细版)
  • keil5 µVision 升级为V5.40.0.0:增加了对STM32CubeMX作为全局生成器的支持,主要有哪些好处?
  • Elasticsearch只返回指定的字段(用_source)
  • 实现AWS Step Function安全地请求企业内部API返回数据
  • c# MES生产进度看板,报警看板 热流道行业可用实时看生产进度
  • 【问题笔记】解决python虚拟环境运行脚本无法激活问题
  • Flink框架十大应用场景
  • 基于SpringBoot的网上找律师管理系统
  • 四月下旬系列
  • (03)Vue的常用指令
  • 23种设计模式全解析及其在自动驾驶开发中的应用