书接上文:MySQL的逻辑架构,以及从架构的视角解读一条SQL查询数据在MySQL内部是如何执行的?,本文全面系统的介绍一下MySQL当中的比较重要的存储引擎,以及常见存储引擎的对比。
存储引擎负责mysql中数据的存储和提取。它的架构模式是插件式的,支持InnoDB、MyISAM等多种存储引擎。从5.5版本后,默认采用InnoDB引擎。
存储引擎负责提供API接口给Server层的执行器调用(如果对SQL的执行过程不清楚的,可以参考上篇文章:《
从MySQL架构看一条SQL语句是如何执行的?》),这些API接口屏蔽了不同存储引擎之间的差异,使得这些差异对Server层的查询过程是透明的。
不同的存储引擎,存储数据的格式一般是不同的。甚至有的存储引擎(Memory)都不用磁盘来存储数据,也就是说关闭服务器后表中的数据就消失了。
如何查看mysql支持哪些存储引擎?
通过show engines
命令,可以查看mysql支持哪些存储引擎
mysql>show engines;
列内容示意:
1. Engine
:存储引擎名字
2. Support
:mysql是否支持,InnoDB是DEFAULT,表示它是默认的存储引擎;
3. Comment
:存储引擎的简单介绍
4. Transactions
:是否支持事务,只有InnoDB引擎支持事务;
5. XA
:是否支持分布式事务,只有InnoDB引擎支持;
6. Savepoins
:保存点,用于部分事务的回滚,只有InnoDB引擎支持;
创建表时,如何指定存储引擎?
创建表时,如果没有指定存储引擎,使用默认的存储引擎InnoDB;也可以自己指定存储引擎。
create table 表名(
建表语句;
) engine = 储存引擎名称;
如何查询表的存储引擎?
通过 show table status like 'table'
查看表使用的存储引擎。
mysql>show table status like 'table'
----------------------------------------
| Name(表名) | Engine(使用的存储引擎) |
| ------------ | -------------------- |
| table_user | InnoDB |
----------------------------------------
下面让我们进入正题,学习比较重要的几个存储引擎。通过星号⭐区分重要程度哦~
InnoDB是mysql默认的事务型引擎,它支持事务。是一种兼顾高可靠性和高性能的通用存储引擎。在mysql5.5版本以后,默认采用InnoDB引擎;
InnoDB通过使用多版本并发控制,也就是大名鼎鼎的MVCC来支持高并发。并且实现了SQL标准的4种隔离级别,其默认级别是REPEATABLE READ
(可重复读)。并且通过间隙锁(next-key locking)策略防止了幻读现象的产生。
事务的四种隔离级别:
READ UNCOMMITTED
:未提交读READ COMMITTED
:提交读REPEATABLE READ
:可重复读[默认]SERIALIZABLE
:可串行化除此之外,InnoDB引擎还提供了插入缓冲区(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
InnoDB是基于聚簇索引建立的,聚簇索引对主键的查询有很高的性能。但是它的二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。
InnoDB引擎关键特性:
在MySQL5.1及以前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括:全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁,并且有一个毫无疑问的缺陷就是奔溃后无法安全恢复。
MyISAM引擎关键特性:
count(*)
的查询效率很高,时间复杂度是O(1)
。(可能的)应用场景::
注意这里只是原则上可以应用的场景,笔者工作上还没有遇到过MyISAM表,即便是日志存储,通常都是通过Elasticsearch
来实现的。
Memory存储引擎表结构保存在磁盘上,但是数据保存在内存中,不需要进行磁盘IO,所以它的速度是很快的。但是因为数据保存在内存中,当MYSQL服务器重启后,表数据会丢失。
对比项 | MyISAM引擎 | InnoDB引擎 |
---|---|---|
默认存储引擎 | NO | YES |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
锁粒度 | 表锁 | 行锁,并且通过MVCC可以有效减少加锁操作,提高性能 |
支持数据异常崩溃后的安全恢复 | NO | YES(redo log日志) |
缓存 | 只缓存索引,不缓存真实数据 | 缓存索引,也缓存真实数据 |
关注点 | 减少磁盘空间占用、减少IO | 事务、并发写入等 |
参考资料: