一文讲述MySQL所有的存储引擎
昨天阿粉已经讲述了关于 MySQL 的存储引擎都有哪些,我们再来回顾一下:
MYSQL 存储引擎分类:
- InnoDB、
- MyISAM、
- MEMORY、
- CSV、
- BLACKHOLE、
- FEDERATED、
- MRG_MYISAM、
- ARCHIVE、
- PERFORMANCE_SCHEMA。
昨天阿粉主要说的是关于 InnoDB 存储引擎的特点,以及关于 InnoDB 的硬盘结构,还有他的优点,今天阿粉来讲一下关于 MySQL 存储引擎剩下的一些相关的内容,大家只需要了解一下,知道有这么回事就行了。
MySQL 的 MyISAM 存储引擎
我们要知道一个事情,MySQL 在 5.58以前,默认使用的不是 InnoDB 引擎,默认使用的就是 MyISAM 存储引擎。
MyISAM 存储引擎不支持事务,支持表级锁,非聚集索引[B-Tree索引,R-Tree索引(空间数据索引),Full-text索引(全文索引)],不支持外键,访问速度快。
MyISAM引擎的索引结构为B+Tree,其中B+Tree的数据域存储的内容为实际数据的地址,也就是说它的索引和实际的数据是分开的,只不过是用索引指向了实际的数据,这种索引就是所谓的非聚集索引。如下图所示:
这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
MyISAM 使用的是表级锁,也就意味着在对表中的数据进行修改时,需要对整个表进行加锁。
而在对表中的数据进行读取时,也需要对所有的表加共享锁。读取和写入这两种操作是互斥的,当然在一些情况下我们对表的数据进行读取时,也可以在表的末尾插入数据。
由此可以看出,MyISAM对读写混合的并发性并不是太好,如果只是只读的话,就并发性而言,还是可以接受的,因为共享锁不会阻塞共享锁。
还有一点,MyISAM 表支持数据压缩
如果 MyISAM 表是一张很大的只读表,也就是在表创建完并导入数据后,就不会对表进行任何修改操作,那么我就可以对表进行压缩操作。这样可以减少磁盘IO。
MEMORY 存储引擎(了解)
MEMORY是MySQL中一类非常特殊的存储引擎,与MySQL中其他的存储引擎不同的是MEMORY存储引擎创建包含存储在内存中的内容的专用表。由于数据容易受到崩溃,硬件问题或断电的影响,因此只能将这些表用作临时工作区或从其他表中提取数据的只读缓存。
MEMORY存储引擎将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。这在某种程度上决定了MEMORY存储引擎的特性:
(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;
(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;
(3)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;
(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
(5)默认使用hash索引。
(6)如果一个内部表很大,会转化为磁盘表。
相对于MySQL数据库的首选存储引擎—InnoDB,MEMORY存储引擎似乎毫无竞争力,但总体而言,MEMORY存储引擎拥有极高的插入,更新和查询效率。
虽然他现在毫无竞争力,但是针对效率上来说,MEMORY 存储引擎反而更胜一筹。
CSV 存储引擎(了解)
CSV存储引擎使用逗号分隔值格式的文本文件存储数据。
要允许使用这个存储引擎,当你建立MySQL之时,使用--with-csv-storage-engine选项来configure。
当你创建一个CSV表之时,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并且由一个.frm的扩展名。存储引擎也创建一个数据文件。它的名字由表的名字开始,并且有一个.CSV的扩展名。数据文件是无格式文本文件。当你把数据存储进表时,存储引擎用CSV格式把它存进数据文件。
CSV存储引擎的数据存储方式非常的有特点,如果我们把数据存储在MYISAM和Innodb表中的话,
其数据文件我们是不能够直接查看的,因为这两种数据文件的存储呢,都是以二进制文件方式来存储的,而CSV存储引擎则不同。
CSV存储引擎是以文件方式来进行存储的,也就是说,我们可以通过查看文件的命令,比如more,或者是vim工具,直接查看或者编辑CSV存储引擎中的表,只要符合CSV文件的格式,我们就不要担心损坏数据
总结一下 CSV 存储引擎的特点。
- 以CSV格式进行数据存储
- 所有列必须都是不能为NULL的
- 不支持索引
- 可以对数据文件直接编辑
- 保存文本文件内容
至于剩下的引擎那就真的是了解都是奢侈的呀:
Blackhole引擎(知道有这么回事就行)
Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。
但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。
Blackhole引擎也称之为黑洞引擎,我估计这么叫的原因就是因为写入的任何数据都会消失,一般用于记录binlog做复制的中继,所以称之为黑洞引擎
FEDERATED 存储引擎
FEDERATED 存储引擎能让你访问远程的 MySQL 数据库而不使用 replication 或 cluster 技术(类似于 Oracle 的 dblink ),使用 FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。
FEDERATED存储引擎默认不启用。
FEDERATED 引擎使用注意事项
1、FEDERATED 表可能会被复制到其他的slave数据库,你需要确保slave服务器也能够使用定义在connection中或mysql.servers表中的link的用户名/密码 连接上远程服务器。
2、远程服务器必须是MySQL数据库
3、在访问FEDERATED表中定义的远程数据库的表前,远程数据库中必须存在这张表。
4、FEDERATED 表不支持通常意义的索引,服务器从远程库获取所有的行然后在本地进行过滤,不管是否加了where条件或limit限制。
--查询可能造成性能下降和网络负载,因为查询返回的数据必须存放在内存中,所以容易造成使用系统的swap分区或挂起。
5、FEDERATED表不支持字段的前缀索引
6、FEDERATED表不支持ALTER TABLE语句或者任何DDL语句
7、FEDERATED表不支持事务
8、本地FEDERATED表无法知道远程库中表结构的改变
9、任何drop语句都只是对本地库的操作,不对远程库有影响
MRG_MYISAM 存储引擎(知道有就行)
MRG_MYISAM 存储引擎,是一组 MyISAM 的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作
ARCHIVE 存储引擎(能说出来最好)
ARCHIVE 储存引擎的应用场景就是它的名字的缩影,主要用于归档。ARCHIVE 储存引擎仅支持select和insert,最出众的是插入快,查询快,占用空间小。
例如我们有大量的历史数据极少访问又不能删除,需要保存,那么它是非常不错的选择。archive最出名的就是压缩,它的引擎使用zlib无损数据压缩算法,压缩率非常高。
Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。当数据量非常大的时候Archive的插入性能表现会较MyISAM为佳。
功能特点
- 只支持insert、replace和select
- 支持行级锁和专用的缓存区,可实现高并发
- 只允许在自增ID列上加索引
- 支持分区,不支持事务处理
PERFORMANCE_SCHEMA 存储引擎(知道有就可)
Performance_schema 存储引擎,是 MySQL 数据库系统专用引擎,用户不能创建这种存储引擎的表。
系统默认数据库 performance_schema 中的表就是采用这种存储引擎。数据库 performance_schema 用于监控 MySQL 在一个较低级别的运行过程中的资源消耗、资源等待等情况。
因为毕竟,我们是没办法创建的,所以知道就OK了?
关于 MySQL 的存储引擎,阿粉就讲完了,你掌握了多少呢?
本文转载自公众号:java极客技术