存储引擎可以理解为一种数据存取和处理方式.Mysql数据库自带多种存储引擎,每种存储引擎都拥有各自的特性
MEMORY存储引擎
memory存储引擎的表只拥有一个磁盘文件,用来存储表结构的定义,其拓展名为.frm.memory引擎表的数据存在内存中,当Mysql关闭时,所有数据都会消失.
创建表
Create Table t_mem1 CREATE TABLE `t_mem1` (
`id` int(11) DEFAULT NULL
) ENGINE=MEMORY
表结构磁盘文件
插入数据并查询
重启数据库
sudo /etc/init.d/mysql restart
重新查询数据
memory引擎表的数据存于内存中,那么mysql服务端就要为其单独分配内存空间,那么考虑以下两个问题
- memory引擎表占用多大的内存空间,或者说被分配了多少空间
- memory引擎表占用的内存空间什么时候能够释放
关于第一个问题,memory引擎表占用的内存空间不能超过系统变量max_heap_table_size 设置的大小,该值默认是16MB.
如果想自由指定大小,可在会话级别设置该变量.
注意,当数据库重启时,所有表会自动继承全局max_heap_table_size ,即都会变成16MB,不管之前设置的是多少.
关于第二个问题,分配给 memory引擎表的内存空间正常状态下不会回收,只有表被删除时才会回收.
CSV存储引擎
CSV存储引擎基于CSV格式文件存储数据
CREATE TABLE `t_csv1` (
`id` int(11) NOT NULL,
`v1` varchar(20) NOT NULL DEFAULT ''
) ENGINE=CSV
插入数据并查询
此时磁盘上会有三个对应文件
.frm是表的结构定义文件
.csv 是数据文件,保存在表中插入的数据,这个文件可以直接在excel或其他编辑文件中打开.
.csm 是元信息文件,用来保存表的状态和表中保存的数据量.
打开.csv文件,可以看到存储的内容如下
下面尝试直接在.csv数据文件中插入数据
重启数据库查询一下数据
可以看到直接操作.csv文件存储数据也是可行的,但这种方式存在风险.下面我们来插入这样两条数据
重启数据库查询一下数据
可以看到由于刚才我们插入了一条不合理数据,导致表被破坏,需要修复.下面进行检查和修复.
数据修复后再来查询数据
再来看一下数据文件中的数据
check 用法
check语句会会检查每行记录是否合法,一旦发现不合法的行就会抛出错误,用repair进行修复时,一旦发现不合法行,其后面的数据都会丢失,不管这当中是否包括合法行.
ARCHIVE存储引擎
ARCHIVE存储引擎最大的特点就是使用zlib无损数据压缩算法将数据进行压缩存储,从而节省空间.并且还可以使用optimize table分析表并使其打包成更小的格式.
创建表,并查询所占空间
查询存储引擎为MyISAM的表
从两张表的Data_length字段可以看出,archive引擎表所占空间更小,当然这里由于数据量较小,看着差距并不太明显.
ARCHIVE存储引擎 存储引擎目前仅能insert和select语句,不能支持delete和update语句.
ARCHIVE引擎 表拥有一个.frm的结构定义文件,还有一个.arz的数据文件.
BLACKHOLE存储引擎
从上图可以看到,创建了一个blackhole引擎表,并插入了两条数据,但查询时却返回为空. 这就是BLACKHOLE存储引擎,虽然可以像其他存储引擎一样接受数据,但是插入的数据并不会被保存,blackhole引擎表永远保持为空.
但是虽然BLACKHOLE存储引擎并不保存数据,但如果启用binlog,那么执行的sql语句是会被记录的,结合赋值赋值特性,产生一些有意思的作用.
MERGE存储引擎
MERGE存储引擎也被成为MERGE_MyISAM存储引擎,就是将一组MyISAM聚合在一起,使用是就像一张表,以此来简化操作.MERGE存储引擎能够聚合的MyISAM的表必须完全一致.
下面创建merge引擎表,并查询数据
从上面的查询结果可以看出,merge引擎表的结果就像是执行了
merge引擎表有一个.frm的表结构定义文件,还有一个.mgr的文件,这个文件中不保存数据,而是记录数据的来源.
merge引擎表不仅支持查询,还支持插入,修改,删除,在执行update和delete时,和普通用法一样.insert 有一点特殊,因为merge引擎表是一个集合,如果按照普通用法,它是不知道将数据插到那个MyISAM表中的.所以需要增加一个insert_method选项.
NO: 不允许插入,也是默认值
first:插入到第一个表中
last:插入到最后一个表中
MyISAM存储引擎和InnoDB存储引擎
选项 | MyISAM存储引擎 | InnoDB存储引擎 |
---|---|---|
最大存储能力 | 256TB | 64TB |
MVCC | No | Yes |
B-tree索引 | Yes | Yes |
Clustered索引 | No | Yes |
Hash索引 | No | No |
全文检索索引 | Yes | No |
索引缓存 | Yes | Yes |
数据压缩 | Yes | Yes |
复制 | Yes | Yes |
查询缓存 | Yes | Yes |
事务 | No | Yes |
数据缓存 | No | Yes |
数据加密 | Yes | Yes |
外键约束 | No | Yes |
锁力度 | Table | Row |
集群数据库 | No | No |
备份/时间点恢复 | Yes | Yes |
-
MyISAM存储引擎
在MERGE存储引擎部分,已经创建了MyISAM引擎表.MyISAM引擎表在磁盘上会有三个对应文件,如下图
.frm 表结构定义文件
.MYD 数据文件,存储数据
.MYI 索引文件,用来存储表的索引信息
MyISAM存储引擎 锁粒度太粗,是表级锁,不支持事务 - InnoDB存储引擎
创建一个 InnoDB引擎表
在磁盘上只能看到一个.frm的表结构定义文件,并没有数据文件
InnoDB存储引擎的数据存在哪里呢?InnoDB存储引擎有一个表空间的概念,且这只是一个逻辑上的概念,在物理磁盘上可能对应多个数据文件.