MySQL常用存储引擎
CSV存储引擎
文件系统存储特点
CSV存储引擎可以将CSV文件作为MySQL的表来处理,这种存储引擎的存储格式就是普通的CSV文件。
CSV存储引擎存储数据的方式非常有特点,如果我们把数据存入到MyISAM或者Innodb存储引擎中去的话,数据文件我们是不能直接查看的,因为这两种存储引擎都是以二进制文件来进行存储的。而CSV存储引擎则不同,CSV是通过文件的形式来存储的,数据以文本的方式存储在文件中,我们可以直接查看文件中的数据。
CSV存储引擎建立表之后,会产生三个文件,分别是 以 .CSV、.CSM、.frm后缀结尾的文件。.CSV文件存储表的内容,.CSM文件存储表的元数据如表状态和数据量,.frm文件存储表的结构信息。
功能特点
以CSV格式进行数据存储
前面说了,CSV存储引擎最大的特点就是以CSV文件格式进行存储,存储内容特点是数据以英文逗号隔开,文本用双引号引起来。下图就是CSV文件存储的内容。
所有列必须都是不能为NULL的
CSV存储引擎存储的数据是不能为NULL的
不支持索引
CSV不支持索引,索引的主要作用就是为了优化查询效率。如果一个表不支持索引,那么每次查询都会进行全表扫描。对于一个大表来说,查询效率会非常低。所以从这点来讲,CSV存储引擎不适合大表存储,以及实时性高,查询效率要求高的业务查询。
可以对数据文件直接编辑
因为存储的是CSV文件,我们可以直接对文件进行编辑。这一点也是与其他以二进制进行存储的存储引擎所不同的。
适用场景
适合作为数据交换的中间表
我们可以把excel的数据存储为CSV格式,然后复制到MySQL目录下,就可以在MySQL中进行使用了。
同样的,我们使用CSV存储引擎,在数据库中写入数据后,其他程序也能立刻读取到写入的文件内容。
所以说CSV非常适合作为数据交换的中间表来进行使用。
Archive存储引擎
文件系统存储特点
- 以zlib对表数据进行压缩,磁盘I/O更少
archive存储引擎会缓存所有的写,并且会以zlib对插入的行进行压缩。所以archive存储引擎会比MyISAM存储引擎的表更加节约磁盘IO。对于相同数量的数据,archive比MyISAM和Innodb更加节约空间。 - 数据存储在ARZ后缀的文件中
archive存储引擎存储的数据文件是以ARZ为后缀的文件中,同时也与其他存储引擎一样也有一个frm的文件,用以存储表的结构信息。
功能特点
只支持insert和select操作
相对于其他存储引擎,最大的不同点就是archive存储引擎只支持insert和select操作。archive存储引擎支持行级锁和专用缓冲区,可以实现高并发的插入。这个存储引擎在某些方面模仿了事务型存储引擎的特点,但archive本身并不是事务存储引擎
只允许在自增ID列添加索引
第二个特点就是只能在自增id列添加索引,不能在其他列添加索引
适用场景
日志和数据采集类的应用
由于这种存储引擎的特性决定了,不能支持删除和修改操作,支持插入和查询操作。同时能对数据进行压缩。这种特性就比较适合记录日志之类的操作。
Memory存储引擎
文件系统存储特点
memory 存储引擎也称为HEAP存储引擎。这个存储引擎的所有数据是存储在内存当中,这也意味着这种存储引擎表的数据是容易丢失的,一旦MySQL服务器重启或者由于其他原因导致的服务器关闭,都会导致Memory存储引擎表中的数据丢失。
表中的数据是存储在内存当中,但是表结构是独立的。表结构不会因为MySQL重启而丢失。memory存储引擎的表,只有一个.frm文件,用以存储表的结构信息。
由于数据是存储在内存当中,所以memory存储引擎的表的IO效率要比其他存储引擎高很多。
功能特点
支持HASH索引和 B-树索引
在建立索引时,如果没有指定索引类型,默认会创建HASH索引。由于HASH索引的特点,如果是做等值查询的话,会非常的快。但是要做范围查询的时候,就无法使用HASH索引了。所以当我们建立索引的时候呢,一定要清楚业务如何使用表的,等值查询场景较多则使用HASH索引,范围查询比较多的话使用B-树索引。
所有字段都为固定长度
memory表使用固定长度的行存储格式,可变长度类型如Varchar使用固定长度。比如我们定义时定义了varchar(5)这样的数据类型,在存储时都会转成char(5)。
我们使用varchar可以定义的时候给的长度大一些,因为这是可变长度,最终占用的长度根据实际使用的长度决定。比如varchar(5),存储字符串“abc”,则实际长度为3。而如果使用char(5),存储字符串“abc”,实际占用的长度就是5。
memory存储引擎的表不能使用可变长度类型,只能使用固定长度类型,这就要求我们定义的时候要注意存储内容的大小,避免使用固定长度造成存储空间的浪费或不足。
Memory表不能包含BLOB 或 TEXT列
对于大文本的存储,memory是不能支持blob或text类型的数据。
Memory存储引擎使用表级锁
memory使用的是表级锁,我们把memory与Innodb做一下比较,memory存储效率未必就比Innodb高,因为Innodb也会把热数据缓存到内存中,而且Innodb是行级锁,粒度更小一些。
Memory表大小由max_heap_table_size控制
Memory表大小由max_heap_table_size控制,该值默认为16MB。max_heap_table_size 用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
我们可以用下面的语法进行修改,但是注意修改对已经存在的memory表是无效的。
SET GLOBAL max_heap_table_size=2147483648
或者在配置文件中修改
vi /etc/my.cnf
[mysqld]
max_heap_table_size = 2048M
tmp_table_size = 2048M
MEMORY表支持AUTO_INCREMENT列
memory存储引擎可以使用自增列
像其他非临时表一样,非临时内存表也可多Session共享
memory存储引擎的表是可以多session之间进行访问
Memory表与 TEMPORARY(临时)表
两者均可将数据放入内存,当临时表数据超过tmp_table_size时,自动转化为磁盘表,性能急剧下降
MEMORY表数据满之后,会提示错误,不会进行转化。
memory存储引擎的表是非临时表,多session是共享可见的。而临时表则只能当前session可见。
适用场景
用于查找或者是映射表,列如地区对应表
用于保存计算或分析产生的临时数据
缓存周期性聚合数据的结果表
memory存储引擎数据是易丢失的,临时的。我们要注意数据应该是可以重新生成的数据,而不能作为一种长久存储的数据进行使用。就类似于我们的缓存操作以一样。
Federated存储引擎
FEDERATED存储引擎能让你访问远程的MySQL数据库而不使用replication或cluster技术(类似于Oracle的dblink),使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。
存储特点
1 本地服务器 FEDERATED 存储引擎的表只存放表的.frm结构文件
2 远程服务器 存放了.frm和数据文件
3 增删改查操作都是通过建立的连接来访问远程数据库进行操作,把结果返回给本地。
4 远程数据表的存储引擎为MySQL支持的存储引擎,如MyISAM,InnoDB等
使用场景
我觉的这个存储引擎没啥用,对于这个存储引擎我也不去深究了。默认MySQL这个存储引擎是不可用的,想要使用还得再MySQL中开启。更多的可以参考《 FEDERATED 存储引擎描述》 这篇文章。