存储引擎是基于表的,而不是数据库。
1.myisam
1)特点
- 支持全文索引
- 拥有较高的插入,查询速度
- mysql版本5.5.8之前默认存储引擎
- 允许没有任何索引和主键的表存在
- 使用的B-tree作为索引结构,叶节点的data域存放的是数据记录的地址
- 基于isam(index sequential access method 有索引的顺序访问方法)存储引擎
- 不支持事务
- 不支持外键约束
- 表锁,不支持行锁
- 只缓存索引,不会数据
- 读写相互阻塞,不仅会在写入的时候阻塞读取,myisam慧慧在读取的时候阻塞写入,但读本身并不会阻塞另外的读
2)存储结构
数据文件(.MYD):存放表数据
索引文件(.MYI):存放表索引
结构文件(.frm):存放表结构的定义信息
(可以直接拷贝数据文件和索引文件到不同的服务器上使用)
3)存储引擎分类
a.静态myisam:静态表,字段都是非变长的。存储非常迅速,容易缓存,出现故障容易恢复,占用空间通常比动态表多
b.动态mysiam:动态表,更新删除数据会产生碎片
c.压缩myisam:压缩表,使用myisampack工具创建
2.InnoDB
1)特点
- 缓存索引和数据
- 支持行锁定和外键
- 支持外键完整性约束
- 支持事务安全表(ACID)
- 5.6.4版本之后支持全文索引
- 5.5.8之后mysql默认存储为innodb
- 辅助索引data域存储相应记录主键的值而不是地址
2)ACID
- 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
- 一致性(Consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态。
- 隔离性(Isolation):通常一个事务所做的修改在最终提交前,对其他事务是不可见的。事务的隔离性是用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
- 持久性(Durability):一旦事务提交,则其他所有的修改就会永久保存到数据库中。
3)存储结构:
.frm:表结构定义
.ibd:表数据和表索引
(存储方式上有共享表空间存储和多表空间存储两种方式)
3.memory
- 不支持blob或text列
- 数据表只存在于内存中,常应用于临时表
- 默认使用hash索引,所以数据的存取速度非常块
- 将表中的数据存储到内存中,未查询和引用其他数据提供快速访问
4.archive
- 只支持select和insert语句
- 常用于日志记录和聚合分析方面
- 5.5版本之前不支持索引,之后支持索引
5.CSV
- 不支持索引
- 不允许表中的字段为null
- 创建的表会在数据目录下生成csv文件
6.balckhole
- 支持事务和MVCC行锁
- 写入这种引擎表的任何数据都会消失
- 主要用于日志记录或同步归档的中继存储
7.performance_schema
- 用于收集数据库服务器性能参数
8.mrg_myisam
- merge存储引擎是一组myisam表的组合,表结构必须完全相同
9.TokuDB和面向列
-
TokuDB引擎使用了一种新的叫做分形树的索引数据结构,是一种大数据存储引擎。因为其拥有很高的压缩比,可以在很大的数据量上创建大量索引。
-
infobright是最有名的面向列的存储引擎,是为数据分析和数据仓库应用设计的。但是,面向列的存储引擎不支持索引。
-
infobright需要对mysql服务器做指定,因为一些地方需要修改以后适应面向列存储的需要。
10.其他对比
1)count()函数
myisam保存表的总行数,统计表行数查询时直接读取
innodb没有保存表的总行数,统计整个表时会遍历整个表,消耗比较大
2)功能对比
功能 | myisam | innodb | memory | archive |
---|---|---|---|---|
存储限制 | 256TB | 64TB | RAM | 无限制 |
事务 | × | √ | × | × |
全文索引 | √ | √(5.6版本后) | × | × |
哈希索引 | × | × | √ | × |
数据缓存 | × | √ | × | × |
外键 | × | √ | × | × |
11.存储引擎查看
## 查看支持的存储引擎信息
show engines;
## 修改表的存储引擎
## 建议不要混合使用多种存储引擎,否则可能带来一系列复杂的问题,以及一些潜在的bug和边界问题
alter table tb_name engine = engine_name;
## 通过查询表结构的方式查看的存储引擎
show create table tb_name;