InnoDB存储引擎
(1)可以通过自动增长列,方法是auto_increment。
(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,可以支持更高的并发;
(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
(5)支持在线热备份;
(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
(8)支持类似于Oracle的非锁定读,即默认读取操作不会产生锁;
(9)从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。
InnoDB的存储表和索引有如下形式:
(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。
(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。若使用分区表,每个分区对应单独的IBD文件。使用分区表的好处在于提升查询效率。
MyISAM存储引擎
不支持行级锁,只支持并发插入的表锁,主要用于高负载的select;
不支持事务;
MyISAM表是独立于操作系统的:.frm 存储表定义;.MYD 存储数据;.MYI 存储索引。
(1)大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持;
(2)每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16;
(3)最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上;
(4)BLOB和TEXT列可以被索引;
(5)NULL被允许在索引的列中,这个值占每个键的0~1个字节;
(6)所有数字键值以高字节优先被存储以允许一个更高的索引压缩;
(7)每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快;
(8)每个字符列可以有不同的字符集;
(9)有VARCHAR的表可以固定或动态记录长度;
(10)VARCHAR和CHAR列可以多达64KB。
MyISAM类型的表支持三种不同的存储结构:
1)静态型:指定义的表列的大小是固定(即不含有:
xblob
、xtext
、varchar
等长度可变的数据类型),这样MySQL就会自动使用静态MyISAM格式;2)动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时MyISAM就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,随着数据变化的增多,碎片也随之增加,数据访问性能会随之降低;
3)压缩型:如果在数据库中创建在整个生命周期内只读的表,则应该使用MyISAM的压缩型表来减少空间的占用。
- MEMORY存储引擎
所有的数据存储在内存中,默认使用哈希(HASH)索;支持的锁粒度为表级锁。
- CSV 存储引擎
(1)是基于 CSV 格式文件存储数据;
(2)所有列必须强制指定 NOT NULL;
(3)CSV 引擎也不支持索引,不支持分区;
(4)CSV 存储引擎也会包含一个存储表结构的 .frm 文件,还会创建一个 .csv 存储数据的文件,还会创建一个同名的元信息文件,该文件的扩展名为 .CSM ,用来保存表的状态及表中保存的数据量;
(5)每个数据行占用一个文本行。
- ARCHIVE
仅仅支持插入和查询;
在MySQL 5.5版以前不支持索引,但是在MySQL 5.5以后的版本支持;
使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。
- BLACKHOLE
不做实际存储;MySQL还是会正常的记录下Binlog,而且这些Binlog还会被正常的同步到Slave上,可以在Slave上对数据进行后续的处理。
应用场景:
(1)验证语法:验证dump file语法的正确性;
(2)检测负载:以使用blackhole引擎来检测binlog功能所需要的额外负载;
(3)检测性能:由于blackhole性能损耗极小,可以用来检测除了存储引擎这个功能点之外的其他MySQL功能点的性能。
- FEDERATED
主要用于访问其它远程MySQL服务器一个代理,它通过创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而后完成数据存取;在MariaDB上的实现是FederatedX。