MySQL2-存储引擎

MySQL存储引擎概述

MySQL低版本时存储引擎在MySQL安装时就必须和MySQL一起被编译并同时被安装的。

但从MySQL5.1开始,引入了一个新的概念:插件式存储引擎体系结构。让存储引擎层和sql层各自更为独立,耦合更小,甚至可以做到在线加载新的存储引擎,也就是完全可以将一个新的存储引擎加载到一个正在运行的MySQL中而不影响MySQL 的正常运行。

MyISAM存储引擎

MyISAM存储引擎的每一个表都被存放为三个以表名命名的物理文件:存放表结构定义信息的.FRM文件、存放表数据的.MYD文件、存放索引数据的.MYI文件。

MyISAM支持的索引

①B-Tree索引(所有的索引节点都按照balance tree 的数据结构来存储,所有的索引数据节点都在叶节点。该索引有一个较大的限制:参与一个索引的所有字段的长度之和不能超过1000 字节)

②R-Tree索引(主要设计用于为存储空间和多维数据的字段做索引,目前的MySQL来说仅支持geometry类型的字段作索引)

③Full-text索引(全文索引,存储结构也是b-tree,主要是解决在like 查询的低效问题)

.MYD文件

虽然每个MyISAM表都有一个后缀名是.MYD文件,但文件中的存放格式可能并不是完全一样的,因为MyISAM存放格式是分为:静态固定长度(FIXED)、动态可变长度(DYNAMIC)、压缩(COMPRESSED)。

创建表时通过ROW_FORMAT来指定{COMPRESSED| DEFAULT},也可以通过myisampack工具来进行压缩,默认是不压缩的。而在非压缩的情况下,究竟是静态还是动态,那就和表中字段的定义有关了。只要表中有可变长度类型的字段存在,那么该表就肯定是DYNAMIC 格式的如果没有任何可变长度的字段,则为FIXED 格式。也可以通过alter table命令强行将一个带有VARCHAR 类型字段的DYNAMIC 的表转换为FIXED,但是所带来的结果是原VARCHAR 字段类型会被自动转换成CHAR 类型。相反如果将FIXED 转换为DYNAMIC,也会将CHAR 类型字段转换为VARCHAR 类型。

损坏与修复

当mysqld 正在write操作的时候被kill 掉或者其他情况造成异常终止、主机Crash、磁盘硬件故障、MyISAM存储引擎bug会造成表文件损坏。

MyISAM某个表文件出错之后,仅影响该表而不会影响其他表,更不会影响到其他的数据库。

如果某个MyISAM表出现问题则可以在线通过check table命令来尝试校验并可以通过repair table命令来尝试修复。在数据库关闭状态下也可以通过myisamchk工具来对数据库中某个(或某些)表进行检测或者修复。不过不到万不得已不要对表进行修复操作,修复之前做好备份工作。

MyISAM存储引擎的表理论上是可以被多个数据库实例同时使用同时操作的,但MySQL官方的用户手册建议尽量不要在多个mysqld之间共享MyISAM 存储文件,即多实例并发操作同一个MyISAM表。

Innodb存储引擎

Innodb是第三方公司所开发的存储引擎。该引擎最大的特性是对事务的支持以及在保证事务的基础上对性能的优化。(通过log文件来实现数据回滚)

.frm文件存放表结构定义相关的元数据,表数据和索引数据是存放在一起的。至于是每个表单独存放还是所有表存放在一起,完全由用户来决定(通过特定配置)同时还支持符号链接。

Innodb物理结构组成:数据文件

用来存放表中数据和索引数据,包括主键和其他普通索引。Innodb存在表空间(tablespace)概念,Innodb的表空间分为两种形式:

①共享表空间即所有表和索引数据被存放在同一个表空间(一个或多个数据文件)中,通过innodb_data_file_path来指定,增加数据文件需要停机重启。

②独享表空间,也就是每个表的数据和索引被存放在一个单独的.ibd文件中。

共享表空间是必须存在的,因为Innodb的undo信息和其他一些元数据信息都是存放在共享表空间里面的。共享表空间的数据文件是可以设置为固定大小和可自动扩展大小两种形式的,自动扩展形式的文件可以设置文件的最大大小和每次扩展量。在创建自动扩展的数据文件的时候,建议大家最好加上最大尺寸的属性,一个原因是文件系统本身是有一定大小限制的(但是Innodb并不知道),还有一个原因就是自身维护的方便。另外Innodb不仅可以使用文件系统,还可以使用原始块设备,也就是我们常说的裸设备。

当我们的文件表空间快要用完的时候,我们必须要为其增加数据文件,这只有共享表空间有此操作。共享表空间增加数据文件的操作比较简单, 只需要在innodb_data_file_path 参数后面按照标准格式设置好文件路径和相关属性即可,不过这里有一点需要注意的,就是Innodb 在创建新数据文件的时候是不会创建目录的,如果指定目录不存在,则会报错并无法启动。另外一个较为令人头疼的就是Innodb 在给共享表空间增加数据文件之后,必须要重启数据库系统才能生效,如果是使用裸设备,还需要有两次重启。

Innodb物理结构组成:日志文件

Innodb的日志文件可以设置多个日志组(最少2个),同样采用轮循策略来顺序的写入。如果创建Innodb表,那么千万别全部删除innodb 的日志文件,因为很可能就会让你的数据库crash,无法启动或者是丢失数据。

Innodb不仅在功能特性方面和MyISAM 存储引擎有较大区别,在配置上面也是单独处理的。在MySQL启动参数文件设置中,Innodb 的所有参数基本上都带有前缀“innodb_”,不论是innodb 数据和日志相关,还是其他一些性能,事务等等相关的参数都是一样。和所有Innodb 相关的系统变量一样,所有的Innodb 相关的系统状态值也同样全部以“Innodb_”前缀。当然,我们也完全可以仅仅通过一个参数(skip-innodb)来屏蔽MySQL 中的Innodb存储引擎,这样即使我们在安装编译的时候将Innodb 存储引擎安装进去了,使用者也无法创建Innodb的表。

NDBCluster存储引擎

NDB存储引擎也叫NDBCluster存储引擎,主要用于MySQLCluster分布式集群环境,Cluster是MySQL从5.0版本才开始提供的新功能。

Merge存储引擎

MERGE存储引擎可以简单的理解为其功能就是实现了对结构相同的MyISAM 表,通过一些特殊的包装对外提供一个单一的访问入口,以达到减小应用的复杂度的目的。要创建MERGE 表,不仅仅基表的结构要完全一致,包括字段的顺序,基表的索引也必须完全一致。MERGE 表本身并不存储数据,仅仅只是为多个基表提供一个同意的存储入口。所以在创建MERGE 表的时候,MySQL 只会生成两个较小的文件,一个是.frm 的结构定义文件,还有一个.MRG 文件,用于存放参与MERGE 的表的名称(包括所属数据库schema)。

MERGE 表不仅可以提供读取服务,也可以提供写入服务。要让MERGE 表提供可INSERT服务,必须在在表被创建的时候就指明INSERT 数据要被写入哪一个基表,可以通过insert_method 参数来控制。如果没有指定该参数,任何尝试往MERGE 表中INSERT 数据的操作,都会出错。此外,无法通过MERGE 表直接使用基表上面的全文索引,要使用全文索引,必须通过基表本身的存取才能实现。

Memory存储引擎

一个将数据存储在内存中的存储引擎。Memory 存储引擎不会将任何数据存放到磁盘上,仅仅存放了一个表结构相关信息的.frm 文件在磁盘上面。所以一旦MySQL Crash 或者主机Crash 之后,Memory 的表就只剩下一个结构了。Memory 表支持索引,并且同时支持Hash 和B-Tree 两种格式的索引。由于是存放在内存中,所以Memory 都是按照定长的空间来存储数据的,而且不支持BLOB 和TEXT类型的字段。Memory 存储引擎实现页级锁定。

在MySQL 的用户手册上面有这样一个公式来计算Memory 表实际需要消耗的内存大小:

SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)

+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)

+ ALIGN(length_of_row+1, sizeof(char*))

BDB存储引擎

BDB存储引擎全称为BerkeleyDB存储引擎,和Innodb 一样,也不是MySQL 自己开发实现的一个存储引擎,而是由Sleepycat Software 所提供,当然,也是开源存储引擎,同样支持事务安全。BDB 存储引擎的数据存放也是每个表两个物理文件,一个.frm 和一个.db 的文件,数据和索引信息都是存放在.db 文件中。

FEDERATED存储引擎

FEDERATED存储引擎所实现的功能主要用来提供对远程MySQL 服务器上面的数据的访问借口。如果我们使用源码编译来安装MySQL,那么必须手工指定启用FEDERATED存储引擎才行,因为MySQL 默认是不起用该存储引擎的。

当我们创建一个FEDERATED表的时候,仅仅在本地创建了一个表的结构定义信息的文件而已,所有数据均实时取自远程的MySQL 服务器上面的数据库。

ARCHIVE存储引擎

ARCHIVE 存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据。ARCHIVE 表不支持索引,通过一个.frm 的结构定义文件,一个.ARZ 的数据压缩文件还有一个.ARM 的meta 信息文件。由于其所存放的数据的特殊性,ARCHIVE 表不支持删除,修改操作,仅支持插入和查询操作。锁定机制为行级锁定。

BLACKHOLE存储引擎

不管我们写入任何信息,都是有去无回。

CSV存储引擎

CSV存储引擎实际上操作的就是一个标准的CSV文件,他不支持索引。起主要用途就是大家有些时候可能会需要通过数据库中的数据导出成一份报表文件,而CSV 文件是很多软件都支持的一种较为标准的格式,所以我们可以通过先在数据库中建立一张CVS表,然后将生成的报表信息插入到该表,即可得到一份CSV 报表文件了。

猜你喜欢

转载自blog.csdn.net/attack_breast/article/details/84286530