MySQL存储引擎
(作者声明:本文内容主要参考他人文档,原文链接:https://blog.csdn.net/yjclsx/article/details/81911027)
1.MySQL5.7支持的存储引擎有:InnoDB,MyISAM,Memory,Merge,Archive,Federated,CSV,BLACKHOLE,PERFORMANCE_SCHEMA。
2.查看系统所支持的引擎类型:show engines;
其中Support列的值表示引擎是否能使用:Yes表示可以使用,No表示不能使用,需要开启后使用,DEFAULT表示该引擎是当前默认存储引擎。
(注:在MySQL5.5.5之前的版本中,MyISAM是默认存储引擎,MySQL5.5.5之后,InnoDB作为默认存储引擎)
3.InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,是目前最重要、使用最广泛的存储引擎。支持事务安全表(ACID),支持行锁定和外键。
InnoDB主要特性有:
1).InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合。
2).InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎所不能匹敌的。
3).InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
4).InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。
5).InnoDB被用在众多需要高性能的大型数据库站点上,InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。
6).从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。(全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文)。
场景:由于其支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
4.MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物和外键。
MyISAM主要特性有:
1).大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持。
2).当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成。
3).每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16个。
4).最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上。
5).BLOB和TEXT列可以被索引,支持FULLTEXT类型的索引,而InnoDB不支持这种类型的索引。
6).NULL被允许在索引的列中,这个值占每个键的0~1个字节。
7).所有数字键值以高字节优先被存储以允许一个更高的索引压缩。
8).每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当进行INSERT和UPDATE操作的时候,该列会自动更新。所以MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快。
9).可以把数据文件和索引文件放在不同目录。
10).每个字符列可以有不同的字符集。
11).有VARCHAR的表可以固定或动态记录长度。
12).VARCHAR和CHAR列可以多达64KB。
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名指出文件类型:*.frm文件存储表定义、数据文件的扩展名为*.MYD(MYData)、索引文件的扩展名时*.MYI(MYIndex)。
MyISAM的表还支持3种不同的存储格式:
1).静态(固定长度)表:静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的(即不含有:xblob、xtext、varchar等长度可变的数据类型),这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。
2).动态表:动态表包含变长字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁到更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
3).压缩表:压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
场景:如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。
5.MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。
MEMORY主要特性有:
1).MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度。
2).MEMORY存储引擎执行HASH和BTREE索引。
3).可以在一个MEMORY表中有非唯一键值。
4).MEMORY表使用一个固定的记录长度格式。
5).MEMORY不支持BLOB或TEXT列。
6).MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。
7).MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)。
8).MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享。
9).当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)。
MEMORY存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,但也可以使用B树型索引。由于这种存储引擎所存储的数据保存在内存中,所以其保存的数据具有不稳定性,比如如果mysqld进程发生异常、重启或计算机关机等等都会造成这些数据的消失,所以这种存储引擎中的表的生命周期很短,一般只使用一次。现在mongodb、redis等NOSQL数据库愈发流行,MEMORY存储引擎的使用场景越来越少。
场景:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
6.MERGE存储引擎
MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。
场景:对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。
7.ARCHIVE存储引擎
Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。
场景:如果只有INSERT和SELECT操作,可以选择Archive引擎,Archive存储引擎支持高并发的插入操作,但是本身并不是事务安全的。由于具有高压缩和快速插入的特点,Archive存储引擎非常适合存储归档数据,如记录日志信息可以使用Archive引擎。
8.CSV存储引擎
使用该引擎的MySQL数据库表会在MySQL安装目录data文件夹中的和该表所在数据库名相同的目录中生成一个.CSV文件(所以,它可以将CSV类型的文件当做表进行处理),这种文件是一种普通文本文件,每个数据行占用一个文本行。该种类型的存储引擎不支持索引,即使用该种类型的表没有主键列;另外也不允许表中的字段为null。csv的编码转换需要格外注意。
场景:这种引擎支持从数据库中拷入/拷出CSV文件。如果从电子表格软件输出一个CSV文件,将其存放在MySQL服务器的数据目录中,服务器就能够马上读取相关的CSV文件。同样,如果写数据库到一个CSV表,外部程序也可以立刻读取它。在实现某种类型的日志记录时,CSV表作为一种数据交换格式,特别有用。
9.BLACKHOLE存储引擎(黑洞引擎)
创建一个blackhole的表时,服务器server在数据库目录创建一个表定义文件。文件用表的名字开头,以.frm作为扩展名。没有其他文件关联到这个表。blackhole表不存储任何数据,写入这种引擎表中的任何数据都会消失。
场景:如果MySQL 开启了二进制日志,则SQL语句会被记录到二进制日志中(并被复制到从服务器)。这样使用blackhole存储引擎的MySQL可以作为主从复制中的中断重复器或者在其上面添加过滤器机制,这个存储引擎除非有特别目的,否则不适合使用。
10.PERFORMANCE_SCHEMA存储引擎
该引擎主要用于收集数据库服务器性能参数。这种引擎提供以下功能:提供进程等待的详细信息,包括锁、互斥变量、文件信息;保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。
11.Federated存储引擎
该存储引擎可以不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。这种存储引擎非常适合数据库分布式应用。Federated存储引擎可以使你在本地数据库中访问远程数据库中的数据,针对federated存储引擎表的查询会被发送到远程数据库的表上执行,本地是不存储任何数据的。
缺点:
1).对本地虚拟表的结构修改,并不会修改远程表的结构。
2).truncate 命令,会清除远程表数据。
3). drop命令只会删除虚拟表,并不会删除远程表。
4).不支持 alter table 命令。
5).select count(*), select * from limit M, N 等语句执行效率非常低,数据量较大时存在很严重的问题,但是按主键或索引列查询,则很快,如以下查询就非常慢(假设 id 为主索引)
select id from db.tablea where id >100 limit 10 ;
而以下查询就很快:
select id from db.tablea where id >100 and id<150
6).如果虚拟虚拟表中字段未建立索引,而实体表中为此字段建立了索引,此种情况下,性能也相当差。但是当给虚拟表建立索引后,性能恢复正常。
7).类似 where name like "str%" limit 1 的查询,即使在 name 列上创建了索引,也会导致查询过慢,是因为federated引擎会将所有满足条件的记录读取到本地,再进行 limit 处理。
场景: dblink。
12.存储引擎的选择
功能 |
MyISAM |
Memory |
InnoDB |
Archive |
存储限制 |
256TB |
RAM |
64TB |
None |
支持事务 |
No |
No |
Yes |
No |
支持全文索引 |
Yes |
No |
Yes |
No |
支持数索引 |
Yes |
Yes |
Yes |
No |
支持哈希索引 |
No |
Yes |
No |
No |
支持数据缓存 |
No |
N/A |
Yes |
No |
支持外键 |
No |
No |
Yes |
No |
13.数据表的存储位置:
MySQL数据表以文件方式存放在磁盘中,包括表文件、数据文件以及数据库的选项文件。位置:在C:\ProgramData\MySQL\MySQL Server 5.7\Data目录下存放数据表,目录名对应数据库名,该目录下文件名对应数据表。
注意:InnoDB类型数据表只有一个*.frm文件,以及上一级目录的ibdata1文件和ib_logfile0和ib_logfile1等日志文件;使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名指出文件类型:*.frm文件存储表结构定义、数据文件的扩展名为*.MYD(MYData)、索引文件的扩展名时*.MYI(MYIndex)。