前言
部分文字来自
京东面试官有点不耐烦:“InnoDB和MyISAM的区别都说不全?”,我直接紧张到红温。。
文章读后有一些问题,故去查阅后,记录。涉及AI编写,低质低创,见谅。
正文
MySQL各大存储引擎的区别
InnoDB: MySQL 默认的事务性存储引擎, 支持 ACID 事务、行级锁定和外键,适用于大多数需要数据一致性和高并发的场景。
MyISAM:非事务性存储引擎,支持表级锁定,读取速度快,适用于读多写少、不需要事务支持的应用。
Memory: 数据存储在 内存中, 速度极快,但数据易失,适用于临时表或缓存。
Archive: 用于存储大量归档数据, 支持高速插入,但查询性能差, 不支持索引。
详细回答见原文京东面试官有点不耐烦:“InnoDB和MyISAM的区别都说不全?”,我直接紧张到红温。。
什么是存储引擎和执行引擎,他们的区别是什么。
📌我所理解的广义上存储引擎与执行引擎没有什么区别,狭义上存在区别是在执行流程中,执行引擎去调用存储引擎。
存储引擎
- 定义 :存储引擎是数据库中负责存储、读取和管理数据的组件。它处理数据的物理存储结构、数据的持久化、并发控制、事务管理以及数据的检索和更新等操作。
- 职责 :主要负责数据的存储和读取,管理数据的物理布局,包括表结构的存储、索引的创建和维护、事务日志的管理等。不同的存储引擎可能提供不同的特性,如事务支持、锁定机制、存储结构等。
- 使用场景 :根据应用需求选择合适的存储引擎。例如,InnoDB 存储引擎适合需要事务支持和高并发读写的场景,MyISAM 存储引擎适合读多写少的应用,Memory 存储引擎适合临时数据的快速存储和查询。
执行引擎
- 定义 :执行引擎是数据库中负责执行 SQL 语句的组件。它根据 SQL 语句的逻辑,调用存储引擎提供的接口来访问和操作数据,完成查询、插入、更新、删除等操作。
- 职责 :主要负责 SQL 语句的解析、优化和执行。它会将 SQL 语句转换为内部的执行计划,然后根据这个计划调用存储引擎的接口来获取或修改数据。执行引擎还需要处理事务的提交和回滚、并发控制等逻辑。
- 使用场景 :执行引擎是数据库系统的核心组件之一,它需要与存储引擎紧密配合,以高效地执行各种 SQL 操作。不同的数据库系统可能使用不同的执行引擎架构,以适应不同的性能需求和应用场景。
区别总结
- 处理阶段不同 :存储引擎主要在数据存储和读取阶段工作,负责数据的物理存储和检索。执行引擎则在 SQL 语句的执行阶段工作,负责将 SQL 语句转换为执行计划并调用存储引擎来完成操作。
- 关注点不同 :存储引擎关注数据的物理存储结构、并发控制、事务管理等,以确保数据的完整性和一致性。执行引擎关注 SQL 语句的解析、优化和执行计划的生成,以提高查询效率和性能。
- 数据结构和算法不同 :存储引擎通常使用特定的数据结构(如 B+ 树、哈希表等)来组织和存储数据,以支持高效的查找和更新操作。执行引擎则使用各种查询优化算法(如基于规则的优化、基于代价的优化等)来生成最优的执行计划。
那么由此引出下一个问题,MySQL的执行流程是什么,执行引擎和存储引擎各在什么阶段发挥作用
MySQL的执行流程是什么
总览
MySQL 的执行流程可以总结为:连接 -> 查询缓存(可选)-> 解析 -> 优化 -> 执行 -> 返回结果。每个阶段都有其特定的功能和任务,共同协作来完成 SQL 语句的执行。
1. 连接阶段
- 建立连接:客户端通过 TCP/IP 或 Unix 套接字等方式连接到 MySQL 服务器。服务器会为每个连接分配一个连接线程。
- 身份验证:客户端向服务器发送用户名和密码等认证信息,服务器验证用户身份,确保用户具有合法的访问权限。
2. 查询缓存(可选)
- 检查缓存:如果查询缓存(Query Cache)开启,服务器会根据查询语句的哈希值检查是否有匹配的查询缓存数据。
- 返回缓存结果:如果找到匹配的缓存结果,服务器直接将结果返回给客户端,跳过后续的执行流程。这种方式可以显著提高查询性能,但查询缓存可能因为数据更新等原因被频繁清空,因此在某些场景下可能并不适用。
3. 解析阶段
- 词法分析:服务器将客户端发送的 SQL 语句进行词法分析,将其分解为关键字、标识符(如表名、列名)、常量和其他元素。例如,将
SELECT * FROM users WHERE age > 20
分析为SELECT
、*
、FROM
等关键字,以及users
(表名)、age
(列名)、20
(常量)等标识符。 - 语法分析:根据词法分析的结果,服务器会检查 SQL 语句是否符合 MySQL 的语法规范。如果不符合,会返回语法错误信息给客户端。
4. 优化阶段
- 生成执行计划:查询优化器(Optimizer)会对经过解析的 SQL 语句进行成本估算,选择最优的执行计划。例如,对于
SELECT * FROM users WHERE age > 20
,优化器会考虑是否使用索引、如何排序数据等。 - 优化策略:查询优化器会考虑多个优化策略,如索引选择、连接顺序优化(对于涉及多表连接的查询)等。它会根据统计信息(如表的行数、索引的基数等)来估算不同执行计划的成本,并选择成本最低的计划。
5. 执行阶段
- 执行计划的执行:执行器(Executor)根据优化后的执行计划,调用存储引擎的接口来获取或更新数据。例如,对于
SELECT * FROM users WHERE age > 20
,执行器会通过存储引擎查找满足条件的行,并将结果返回给客户端。 - 存储引擎交互:存储引擎负责实际的数据存储和读取操作。不同的存储引擎(如 InnoDB、MyISAM 等)有不同的数据存储结构和访问方式。执行器会根据执行计划中的操作(如查找、插入、更新等),与存储引擎进行交互。
6. 返回结果阶段
- 结果集的生成:执行器将查询结果集逐步生成并发送回客户端。对于查询操作,结果集包含满足查询条件的行数据;对于更新或删除操作,可能返回受影响的行数等信息。
- 处理客户端请求:服务器会根据客户端的请求格式(如文本格式或二进制格式)对结果进行编码,然后通过网络发送给客户端。客户端接收到结果后,会将其解析并呈现给用户(如在命令行显示查询结果,或在应用程序中处理数据)。
其实主要流程为解析-优化-执行
那么MySQL 对比Click House等数据库 和 达梦等国产数据库的执行引擎是什么,各有什么优劣?
ClickHouse 的执行引擎
ClickHouse 采用向量化执行引擎,其特点如下:
- 优势 :以 Block 为单位按列处理数据,数据在内存中按列组织,查询执行的相关操作和函数基于向量进行调度执行,可提高 CPU 缓存利用率,发挥 CPU 的自动向量化编译优化能力,从而实现高效的数据处理和分析性能,尤其适合处理大规模数据分析任务。
- 局限性 :在执行复杂查询时,由于缺乏代价优化器对物理计划的优化,可能导致某些 SQL 场景的查询速度较慢甚至失败。
国产达梦数据库的执行引擎
达梦数据库的执行引擎具有多种特性:
- 支持多种存储引擎 :如行存储引擎、列存储引擎和内存引擎等。行存储引擎适合事务型应用,列存储引擎在数据仓库和大数据分析场景中表现良好,内存引擎则适用于对性能要求极高的临时数据处理场景。
- 查询优化技术 :采用多种查询优化技术,如基于规则的优化和基于代价的优化相结合的方式,可自动选择最优的查询执行计划,提高查询效率。
- 并行计算能力 :支持并行查询和并行数据处理,能够充分利用多核 CPU 的计算能力,加快大规模数据处理的速度。