其中最著名并且使用最普遍的是MyISAM和Innodb两种存储引擎。html
(1)MyISAM是mysql最先的ISAM存储引擎的升级版本,也是Mysql默认存储引擎。 (2)而Innodb实际上并非mysql公司的,而是第三方软件公司Innobase所开发,其最大的特色是提供了事务控制等特性,因此使用者也很是普遍。
其余的一些存储引擎相对来讲使用场景稍微少一些,都是应用于某些特定的场景。mysql
(1)如NDB Cluster虽然也支持事务,但主要是用于分布式环境,属于一个share nothing的分布式数据库存储引擎。 (2)Maria是mysql最新开发的对MyISAM的升级版存储引擎 (3)Falcon是mysql公司自行研发的为了替代当前Innodb存储引擎的一款带有事务等高级特性的数据库存储引擎。 (4)Memory存储引擎全部数据和全部均存储与内存中,因此主要是用于一些临时表,或者对性能要求极高,可是容许在主机Crash的时候丢失数据的特定场景下。 (5)Archive是一个数据通过高比例压缩存放的存储引擎,主要用于存放过时并且不多访问的历史信息,不支持索引。 (6)Merge和Federated在严格意义来讲,并不能算做一个存储引擎。 (7)由于Merge存储引擎主要是将几个基表merge在一块儿,对外做为一个表来提供服务,基表能够基于其余的几个存储引擎。 (8)而Federated实际上所作的事情,有点相似于Oracle的dblink,主要用于远程存取其余mysql服务器上面的数据。
MyISAM支持三种类型的索引:sql
(1)B-Tree索引: 【1】顾名思义,就是全部的索引节点都按照balance tree的数据结构存储 【2】全部的索引数据节点都在叶节点 (2)R-Tree索引: 【1】R-Tree索引的存储方式和B-Tree索引的存储方式有一些区别 【2】主要设计用于为存储空间和多维数据的字段作索引 (3)Full-text索引: 【1】Full-text就是咱们常说的全文索引,他的存储结构也是B-Tree 【2】主要是为了解决咱们须要用like查询的低效问题 (4)MyISAM索引的三种类型中,最常用的就是B-Tree索引,偶尔会使用到Full-text索引,但R-Tree索引通常系统中都是不多用到的。
MyISAM数据存放格式数据库
(1)虽然每个MyISAM的表都是存放在一个相同后缀名的.MYD文件中,可是每个文件的存放格式实际上可能并非彻底同样的。 (2)由于MyISAM的数据存放格式是分为静态(FIXED)固定长度、动态(DYNAMIC)可变长度、以及压缩(COMPRESSED)这三种格式 (3)固然三种格式中是否压缩彻底能够任由咱们本身决定,能够在建立表的时候经过ROW_FORMAT来指定{COMPRESSED | DEFAULT},也能够经过myisampack工具来进行压缩,默认是不压缩的。 (4)而在非压缩的状况下,是静态仍是动态,就和咱们表中各字段的定义相关了。 (5)只要表中有可变长度类型的字段存在,那么该表就确定是DYNAMIC格式的; (6)若是没有任何可变长度的字段,则为FIXED格式; (7)固然,你也能够经过alter table命令,强行将一个带有VARCHAR类型字段的DYNAMIC的表转换为FIXED,可是所带来的结果是原varchar字段类型会被自动转换成char类型。 (8)相反,若是将FIXED转换为DYNAMIC,也会将char类型字段转换为varchar类型,因此你们手工强行转换的操做必定要谨慎。
MyISAM存储引擎的表是否足够可靠?mysql参考手册列出在遇到以下状况的时候可能会出现表文件损坏:安全
(1)当mysqld在作写操做的时候被kill掉或者其余状况形成异常终止 (2)主机crash (3)磁盘硬件故障 (4)MyISAM存储引擎中的BUG
MyISAM表出错后影响范围:服务器
(1)MyISAM存储引擎的某个表文件出错以后,仅影响到该表,而不会影响到其余表,更不会影响到其余的数据库 (2)若是咱们的数据库正在运行过程当中发现某个MyISAM表出现问题了,则能够在线经过check table命令尝试校验它,并能够经过repair table命令尝试修复。 (3)在数据库关闭状态下,咱们也能够经过myisamchk工具来对数据库某个表进行检测和修复。 (4)不过强烈建议不到万不得已不要轻易对表进行修复操做,修复以前尽可能作好可能的备份工做,以避免带来没必要要的后果。 (5)另外myisam存储引擎的表,理论上是能够被多个数据库实例同时使用同时操做的,可是不建议这样作,并且mysql官方文档中也有提到,建议尽可能不要在多个mysqld之间共享MyISAM存储文件。
Innodb其功能方面的特色:数据结构
(1)支持事务安装: 【1】Innodb在功能方面最重要的一点就是对事务安全的支持 【2】并且实现了SQL92标准所定义的全部四个级别(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE) 【3】对事务安全的支持,无疑让不少以前由于特殊业务要求而不得不放弃使用Mysql的用户转而支持mysql,以及对数据选型持观望态度的用户,也大大增长了对mysql的好感。 (2)数据多版本读取: 【1】Innodb在支持事务的同时,为了保证数据的一致性以及并发时候的性能,经过对undo信息,实现了数据的多版本读取。 (3)锁定机制的改进: 【1】Innodb改变了MyISAM的锁机制,实现了行锁。 【2】虽然Innodb的行锁机制的实现是经过索引来完成的,但毕竟在数据库中99%的SQL语句都是要使用索引来检索数据的。 【3】因此,行锁定机制也无疑为Innodb在承受高并发压力的环境下加强了不小的竞争力。 (4)实现外键: 【1】Innodb实现了外键引用这一数据库的重要特性,使在数据库端控制部分数据的完整性成为可能。 【2】虽然不少数据库系统调优专家都建议不要这样作,可是对于很多用户来讲在数据库端加如外键控制可能仍然是成本最低的选择。 (5)物理存储方面: 【1】Innodb存储引擎也和MyISAM不太同样,虽然也有.frm文件来存放表结构定义相关的元数据,可是表数据和索引数据是存放在一块儿的。 【2】至因而每一个表单独存放仍是全部表存放在一块儿,彻底由用户来决定(经过特定配置),同时还支持符号连接。
Innodb物理结构:并发
(1)数据文件(表数据和索引数据) 【1】存放数据表中的数据和全部的索引数据,包括主键和其余普通索引。 【2】在Innodb中,存在了表空间(tablespace)这样一个概念,可是他和Oracle的表空间又有较大的不一样。 (2)Innodb的表空间分为两种 【1】共享表空间: 「1」也就是全部表和索引数据都存放在同一个表空间(一个或多个数据文件)中,经过innodb_data_file_path来指定,增长数据文件须要停机重启。 「2」虽然咱们能够自行设定使用共享表空间仍是独享表空间来存放咱们的表,可是共享表空间必须存在。 「3」由于Innodb的undo信息和其余一些元数据信息都是存放在共享表空间里面的。 「4」共享表空间的数据文件是能够设置为固定大小和可自动扩展大小两种形式的,自动扩展形式的文件能够设置文件的最大大小和每次扩展量。 「5」在建立自动扩展的数据文件的时候,建议你们最好加上最大尺寸的属性,一个缘由是文件系统自己是有必定大小限制的(可是Innodb不知道),还有一个缘由就是自身维护的方便。 「6」另外Innodb不只可使用文件系统,还可使用原始块设备,也就是咱们常说的裸设备。 「7」当咱们当文件表空间快要用完的时候,咱们必需要为其增长数据文件,固然,只有共享表空间有此操做 「8」共享表空间增长数据文件的操做比较简单,只须要在innodb_data_file_path参数后面按照标准格式设置好文件路经和相关属性便可,不过这里有一点须要注意,就是Innodb在建立新数据文件的时候是不会建立目录的,若是指定目录不存在,则会报错并没有法启动。 「9」Innodb在给共享表空间增长数据文件以后,必需要重启数据库系统才能生效,若是是使用裸设备,还须要有两次重启。 【2】独享表空间:也就是每一个表的数据和索引被存放在一个单独的.ibd文件中。 (3)日志文件 【1】Innodb的日志文件和Oracle的redo日志比较相似,一样能够设置多个日志组(最少2个) 【2】采用轮循策略来顺序的写入 【3】若是你的数据库中建立来Innodb的表,那么千万别所有删除innodb的日志文件,由于极可能就会让你的数据库crash,没法启动,或者丢失数据。 【4】因为Innodb是事务安全的存储引擎,因此系统crash对他来讲并不能形成很是严重的损失 【5】因为有redo日志的存在,有checkpoint机制的保护,Innodb彻底能够经过redo日志将数据库crash时刻已经完成但还没来得及将数据写入磁盘的事务恢复,也可以将全部部分完成并写入磁盘的未完成事务回滚并将数据还原。
因此,这一节,主要介绍一下MySQL Cluster的相关内容分布式
(1)简单的说,Mysql Cluster实际上就是在无共享存储设备的状况下实现的一种内存数据库Cluster环境,其主要是经过NDB存储引擎来实现的。 (2)一个Mysql Cluster的环境主要由三部分组成: 【1】负责管理各个节点的Manage节点主机: 「1」管理节点负责整个Cluster集群中各个节点的管理工做,包括集群的配置,启动关闭节点,以及实施数据的备份恢复等。 「2」管理节点会获取整个Cluster环境中各节点的状态和错误信息,而且将各Cluster集群中各个节点的信息反馈给整个集群中其余全部节点。 「3」因为管理节点上保存了整个Cluster环境的配置,同时担任了集群中的各节点的基本工做,全部他必须是最早被启动的节点。 【2】SQL层的SQL服务器节点,也就是咱们常说的mysql server: 「1」主要负责实现一个数据库在存储层之上的全部事情,好比链接管理、query优化和响应、cache管理等等。 「2」只有存储层的工做交给了NDB数据节点去处理了。 「3」也就是说,在纯粹的Mysql Cluster环境中的SQL节点,能够被认为是一个不须要提供任何存储引擎的mysql服务器,由于他的存储引擎有Cluster环境的NDB节点来担任。 「4」因此,SQL层各mysql服务器的启动与普通的mysql服务器启动有必定区别,必需要添加ndbcluster项,能够添加在my.cnf配置文件中,也能够经过启动命令行来启动。 【3】Storage层的NDB数据节点,也就是上面说的NDB Cluster: 「1」NDB是一个内存式存储引擎,也就是说,他会把全部的数据和索引都load到内存中,但也会将数据持久化到存储设备中。 「2」最新版本中,已经支持用户本身选择数据能够不所有load到内存中了,这对于有些数据量太大或者基于成本考虑而没有足够内存空间来存放全部数据的用户来讲的确是一个大好消息。 「3」NDB节点主要是实现底层数据存储功能,保存Cluster的数据。 「4」每个NDB节点保存完整数据的一部分(或者一份完整的数据,视节点数目和配置而定),在mysql cluster中叫作一个fragment。 「5」而每个fragment,正常状况来说都会在其余的主机上有一份(或者多份)彻底相同的镜像存在。 「6」这些都是经过配置来完成的,因此只要配置得当,Mysql Cluster在存储层不会出现单点的问题。 「7」通常来讲,NDB节点被组织成一个一个的NDB Group,一个NDB Group实际上就是一组存有彻底相同的物理数据的NDB节点群。
既然全部数据都是存在内存中,那么他对内存的消耗量可想而知。在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*))
当咱们经过SQL操做FEDERATED表的时候,实现过程基本以下:
(1)SQL调用被本地发布 (2)MYSQL处理器API(数据以处理器格式) (3)Mysql客户端API(数据被转换成SQL调用) (4)远程数据库->Mysql客户端API (5)转换结果包(若是有的话)处处理器格式 (6)处理器API->结果行或受行影响的对本地的计数
Mysql的用户手册上还介绍了BLACKHOLE存储引擎其余几个用途以下:
(1)SQL文件语法的验证 (2)来自二进制日志的开销测量,经过比较容许二进制日志功能的BLACKHOLE的性能与禁止二进制日志功能的BLACKHOLE的性能。 (3)由于BLACKHOLE存储引擎本质上是一个“no-op”存储引擎,它可能被用来查找与存储引擎自身不相关的性能瓶颈。