跳至主要內容

MySQL 常见存储引擎

AruNi_Lu数据库MySQL约 807 字大约 3 分钟

本文内容

1. 介绍

在 MySQL 的体系结构中,有一个非常重要且不同于其他数据库的特性,那就是其 插件式的表存储引擎

注意:存储引擎是基于表的,而不是数据库,意味着同一个数据库不同的表可能有不同的存储引擎。

有存储引擎的好处在于,每个存储引擎都有各自的特点,能够根据 具体的应用建立不同的存储引擎表

MySQL 常见的存储引擎有 InnoDB、MyISAM、Memory。其中 InnoDB 是最为常用的一种引擎,现在的 MySQL 默认也是使用它。

2. InnoDB

InnoDB 存储引擎 支持事务和外键。支持 行级锁,并支持 非锁定读(即默认读取操作不会产生锁)。

创建表时,会创建两个文件:.frm 存放表结构、.ibd 存放数据和索引。

InnoDB 通过使用 MVCC(多版本并发控制)来获得高并发性,并且实现了 SQL 标准的 4 种隔离级别(默认为 REPEATABLE 级别)。

对于表中数据的存储,InnoDB 采用聚簇的方式,每张表都有一个 主键索引(聚簇索引),数据就是存放在聚簇索引中的索引即数据)。

如果没有显示的在表定义时指定主键,InnoDB 则会使用 第一个非 null 的唯一列 作为聚簇索引的索引列,如果再没有,则会使用 隐藏列 row_id 作为聚簇索引的索引列

所以,主键索引一定是聚簇索引,但聚簇索引不一定是主键索引

3. MyISAM

MyISAM 存储引擎 不支持事务,只支持表级锁

创建表时,会创建三个文件:.frm 存放表结构,.MYI 存放索引,.MYD 存放数据。

MyISAM 中 索引和数据是分开存储的。索引中不存放数据,而是只存放 索引列 + 数据记录的地址。所以查询数据时在定位到索引记录后,还需要去硬盘中获取完整的数据。

另外,MyISAM 的缓冲池只缓冲索引文件,而不缓冲数据文件。

4. Memory

Memory 将表中的数据存放在 内存中,如果数据库重启或崩溃,表中的数据都将全部消失(适用于存储临时数据的临时表)。

默认使用 Hash 索引(InnoDB 和 MyISAM 都是使用 B+ 树)。

只支持 表级锁,即使是数据存放在内存中,并发性能也较差。

5. 总结

一个表总结上面三种存储引擎的区别:

特性InnoDBMyISAMMemory
事务、外键支持××
锁的粒度行级别表级别表级别
索引类型B+ 树B+ 树Hash 索引
索引即数据××

6. 参考文章

  • 《MySQL 技术内幕:InnoDB 存储引擎》
上次编辑于: