MySQL 执行流程是怎样的?
可以看到, MySQL 的架构共分为两层:Server 层和存储引擎层,
- Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
- 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。
接下来详细讲解存储引擎层里面用到的存储引擎。
存储引擎
InnoDB:
事务支持:InnoDB是MySQL的默认存储引擎,支持ACID(原子性、一致性、隔离性、持久性)事务,适用于需要事务支持的应用。
行级锁定:它使用行级锁定,因此在高并发环境中可以提供更好的性能。
外键支持:InnoDB支持外键约束,可以确保数据完整性。
崩溃恢复:具有崩溃恢复功能,可以在数据库故障后自动修复数据。
MyISAM:
性能:在读密集型应用中表现良好,适用于用于数据仓库或读取频繁、写入不频繁的应用。
不支持事务:不支持事务和外键,因此不适用于需要数据完整性和事务支持的应用。
表级锁定:它使用表级锁定,这可能导致在高并发情况下性能瓶颈。
MEMORY(也称为HEAP):
内存表:数据存储在内存中,因此访问速度非常快,适用于需要快速访问的临时数据。
不持久化:数据不持久化,意味着在数据库关闭时数据丢失。
表级锁定:使用表级锁定,因此在高并发环境中可能存在性能问题。
Archive:
压缩存储:用于存储大量历史数据,以较小的存储空间。
只读:只支持插入和选择操作,不支持更新和删除。
不支持索引:不支持普通索引,因此查询速度较慢。
CSV 存储引擎:
特点: CSV(Comma-Separated Values)存储引擎将数据以纯文本形式存储在CSV文件中。这种存储引擎主要用于导入和导出数据,或者在不需要事务支持和高性能要求的情况下存储数据。
适用场景: CSV存储引擎适用于需要将MySQL数据与其他应用程序或数据库进行交互的场景。您可以轻松地导出数据到CSV文件,然后将其导入其他系统。它不适合用于高度事务性的应用程序,因为不支持事务和索引。
Blackhole 存储引擎:
特点: Blackhole存储引擎是一个特殊的存储引擎,它实际上不存储任何数据。它会接受您插入的数据,但会立即丢弃这些数据,不会将其持久化到磁盘上。因此,对Blackhole引擎的写入操作非常快速,但数据将永远不会被检索。
适用场景: Blackhole引擎主要用于复制和数据传输方面的情况。例如,您可以将数据从一个MySQL实例复制到另一个实例,但只关心数据的传输速度而不关心数据在目标实例上的存储。 Blackhole可以用作“黑洞”来暂时存储传输的数据。
InnoDB与MyISAM之间的详细对比
存储引擎 | 事务支持 | 锁定级别 | 外键支持 | 崩溃恢复 | 索引 | 其他特性 |
---|---|---|---|---|---|---|
InnoDB | InnoDB是一个支持事务的存储引擎,它遵循ACID(原子性、一致性、隔离性、持久性)属性,因此非常适合需要数据完整性和事务控制的应用。 | InnoDB使用行级锁定(row-level locking),这意味着不同的事务可以同时修改表中的不同行,从而提供更好的并发性能。 | InnoDB支持外键约束,这使得在数据库中建立引用完整性关系变得容易。 | InnoDB具有崩溃恢复功能,可以在数据库故障后自动修复数据。 | InnoDB使用聚簇索引(clustered index),这意味着数据行按照主键的顺序存储在磁盘上,这有助于提高范围查询的性能。 | 表级别的锁定:InnoDB也支持表级锁定,但通常不会使用,因为它会在高并发情况下引起性能问题。 |
MyISAM | MyISAM不支持事务,这意味着它不适合需要强烈数据完整性的应用。 | MyISAM使用表级锁定(table-level locking),这意味着在写入操作时,其他会话将无法同时访问整个表,可能会导致性能瓶颈。 | MyISAM不支持外键约束,这意味着在数据库中建立引用完整性关系较为复杂,需要在应用层面进行处理。 | MyISAM在崩溃后不提供自动恢复功能,需要手动进行修复。 | MyISAM使用非聚簇索引,这意味着索引和数据行是分开存储的,可能导致范围查询性能较差。 | 全文搜索:MyISAM对全文搜索提供了支持,这是一些特定用例的优点。 |
选择哪个存储引擎取决于您的应用需求。如果您需要事务支持、数据完整性、更好的并发性和崩溃恢复功能,则通常选择InnoDB。如果您有一个只读或只读少写的应用,并且对全文搜索有要求,MyISAM也许更适合。但请注意,MyISAM在MySQL 5.5版本之后逐渐失去了支持,因此推荐优先考虑使用InnoDB或其他现代的存储引擎。
比对了存储引擎,那么就少不了去了解在其中起到关键作用的数据结构,B+树了。
B+树
B+树(B-plus tree)是一种常见的树状数据结构,经常用于数据库和文件系统中的索引结构。B+树索引被广泛用于关系数据库管理系统(RDBMS)中,以加快数据检索速度。以下是关于B+树索引的详细信息:
特点和结构:
-
平衡树结构:B+树是一种自平衡的树结构,它保持了所有叶子节点到根节点的最长路径的长度相同,因此查询操作的性能非常稳定,通常是O(log n)时间复杂度。
-
多路搜索树:每个非叶子节点都有多个子节点(通常称为分支因子或阶数),这使得B+树能够高效地管理大量数据。
-
叶子节点存储数据:B+树的叶子节点包含了实际的数据记录,而非叶子节点仅包含索引信息。这有助于减少磁盘I/O操作,因为查询通常需要访问叶子节点而不是非叶子节点。
-
有序性:B+树的叶子节点是按键值有序排列的,这使得范围查询非常高效,因为可以按顺序扫描叶子节点。
-
支持等值查找和范围查询:B+树索引既能支持等值查找(例如,查找具有特定键值的记录),又能支持范围查询(例如,查找所有键值在某个范围内的记录)。
应用:
B+树索引广泛应用于关系型数据库管理系统(RDBMS)中,包括MySQL、PostgreSQL、Oracle等。它们用于加速数据库表的数据检索操作。除了数据库系统,B+树索引还可以在文件系统中用于文件的管理,以及在许多其他应用程序中用于维护有序数据集合。
插入和删除操作:
插入和删除操作需要维护B+树的平衡性,确保树的特性不被破坏。通常,插入操作将新的键值插入到适当的位置,然后调整树结构以保持平衡。删除操作也会删除相应的键值,并进行树的重新平衡。
总的来说,B+树索引是一种高效的数据结构,适用于大规模数据的存储和检索。它的平衡性和有序性特点使得它在数据库和文件系统中都有广泛的应用。