有趣的 Mysql 存储引擎
Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的。应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供的 Api,也就是说不管所操作的表对象使用什么存储引擎,读写数据时执行的 DDL/DML 语句并没有不同
下面介绍使用最广泛的存储引擎
memory 存储引擎
内存存储引擎,直接把表保存到内存中,在磁盘中只拥有一个 .frm 文件,用来存储表结构的定义
通过指定 engine=memory 设置
当 Mysql 服务关闭时,所有 memory 引擎表中的数据全部会丢失
分配给 memory 引擎表的内存,正常情况不会释放,而是有该表一直持有,即使删除数据,也不会被收回,只有当整个表被删除或者重建时才会回收相关内存
memory 引擎表占用多少内存空间?由两个因素决定
-
首先 memory 引擎表能使用的最大内存不能超过 max_heap_table_size 系统设置的值,该值默认情况下是 16MB (还可以在会话时,临时设置 max_heap_table_size 变量的值)
-
在创建时通过 CREATE TABLE 语句的 MAX_ROWS 选项,指定表中最大的记录数的方式来限制表能够使用的内存空间
CSV 存储引擎
CSV 存储引擎是基于 CSV 格式文件存储数据
通过指定 engine=csv 设置
CSV 存储引擎因为自身文件格式的原因,所有列必须强制指定 NOT NULL ,另外 CSV 引擎也不支持索引,不支持分区
CSV 存储引擎也会包含一个存储表结构的 .frm 文件,还会创建一个 .csv 存储数据的文件,还会创建一个同名的元信息文件,该文件的扩展名为 .CSM ,用来保存表的状态及表中保存的数据量
因为 csv 文件本身就可以直接被编辑,保不齐就有不按规则出牌的情况,如果出现csv 文件中的内容损坏了的情况,也可以使用 CHECK TABLE 或者 REPAIR TABLE 命令检查和修复
ARCHIVE 存储引擎
ARCHIVE 存储引擎适用场景恰如其名---归档,基于这个存储引擎,能够将大量数据压缩存储,插入的列会被压缩
使用了 zlib 无损数据压缩算法,并且还可以使用 OPTIMIZE TABLE 分析表并使其打包成更小的格式
相同的数据量,ARCHIVE 存储引擎 比 MyISAM 引擎小了近 8 倍
不足点:
-
目前 ARCHIVE 引擎仅能够支持 INSERT 和 SELECT 语句,而不能支持 DELETE、REPLACE、UPDATE 语句
-
不支持索引
ARCHIVE 引擎除了拥有 .frm 结构文件外,还有一个扩展名为 .arz 的数据文件
BLACKHOLE
黑洞存储引擎,所有插入的数据并不会保存,BLACKHOLE 引擎表永远保持为空
:) 我这里没想到什么适用场景,故不做太多介绍
MERGE 存储引擎
MERGE 存储引擎,也被称为 MGR_MyISAM 存储引擎,它实际上是将一组 MyISAM 表聚合在一起,使用时就和一张表一样
MERGE 存储引擎,要求聚合的表结构、索引要完全一致
使用 engine=merge union=(表名,表名) 创建
除了保存表结构定义的 .frm 文件外,还有一个扩展名为 .mgr 的文件,这个文件不保存数据,而是保存的数据来源地
MERGE 存储引擎出了支持 SELECT 之外,还支持 UPDATE、DELETE 语句
需要支持 insert 语句的话,需要配置 INSERT_METHOD 指定插入的记录保存到哪个表中
INSERT_METHOD 选项有三个值
-
NO: 不允许插入,这也是默认值
-
FIRST 插入到第一个表
-
LAST 插入到最后一个表
MyISAN 存储引擎
如果没有指定表使用的存储引擎,那么创建表的默认存储引擎就是 MyISAN (5.5 以前)
使用 engine=myisam; 设置
默认会创建三个文件
-
frm 文件,用来存储表的对象结构
-
.MYD 文件,用来存储数据
-
.MYI 文件,用来存储索引
MyIASM 特性
-
最大存储能力为 256TB
-
支持 B-tree 索引
-
支持全文索引
-
支持索引缓存
-
支持数据压缩
-
支持复制
-
支持查询缓存
-
地理(三维)数据类型支持
-
地理数据索引支持
-
支持数据加密
-
支持统计信息
-
锁粒度到 table
-
支持备份/时间点恢复
MyISAN 不支持的
-
MVCC 不支持
-
clustered 索引不支持
-
hash 索引不支持
-
不支持事物
-
不支持数据缓存
-
不支持外健约束
-
不支持行级锁
MyISAM 主要优点是:查询快,写入快
MyISAM 支持三种存储格式:静态(FIXED)、动态(DYNAMIC)、压缩(COMPRESSED)
静态:
静态指的是,表不包含(varchar/varbinary/blob/text)
静态表会把以上字段类型会自动填充到达列的长度
较快,易于缓存
易于崩溃后重建
比动态表占用更多的磁盘空间
静态表,很容易可以到磁盘中的数据文件定位和查找记录,因为每一行记录都是固定的
动态:
包含(varchar/varbinary/blob/text)
除了字符串长度小于4的列外,其他字符串的长度都是动态的
比静态的更节约空间
压缩:
压缩表是只允许已读的,优点在于更节省空间,更快
InnoDB 存储引擎
mysql 5.5 之后。InnoDB 被认定为默认的存储引擎
InnoDB 有下列关键特性
-
设计遵循 ACID 模型,支持事物,拥有从服务崩溃中恢复的能力,能过最大限度的保护用户的数据
-
支持行级锁,并且引入了类型 Oracle 数据库中的一致性读特性,以提升多用户并发时的读写性能
-
InnoDB 引擎表组织数据时按照主键聚族,通过主键查找数据时性能极为优异
-
在维护数据完整性方面,InnoDB 支持外建约束
-
在服务器发生故障的情况下,Mysql 服务在启动时,会自动进行故障恢复
-
InnoDB 拥有自己的缓存池,常用的数据和索引都在缓存中
-
对于 INSERT,UPDATE,DELETE 操作,会被一种称为 change buffering 的机制自动优化
什么是 ACID ?
即事物的四个特性:原子性、一致性、隔离性、持久性
InnoDB 存储引擎的特点
-
存储能力 64TB
-
支持 MVCC
-
支持 B-tree 索引
-
支持 Clustered 索引
-
外建约束
-
查询缓存
-
索引缓存
-
数据缓存
-
事物
-
地理(三维)数据类型支持
-
数据加密
-
数据压缩
-
统计信息
-
支持行级锁
-
备份/时间点恢复
-
复制支持
不支持的功能
-
不支持 Hash 索引
-
不支持全文索引
-
地理数据索引支持
InnoDB 和 MyISAM 的区别
-
InnoDB不支持FULLTEXT类型的索引。
-
InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
-
对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
-
DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
-
LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
-
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
-
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。