当前位置: 首页 > 技术与资源 > 技术分享 > 正文

MYSQL存储引擎介绍及选择

2016-01-22 10:34:40

作者:梁冠群新炬网络高级技术专家。


1. MYSQL受欢迎的原因


MYSQL作为一种关系型数据库管理系统,因其体积小、速度快、总体拥有成本低受到中小企业的热捧,开放源代码、支持多种存储引擎等特性更是让一般中小型网站的开发都选择MYSQL作为网站数据库。MYSQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用。


2. 存储引擎的概念


MYSQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,就能够获得额外的速度或者功能,从而改善应用的整体功能。


例如,如果在研究大量的临时数据,一般需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者为确保事务处理不成功时具备数据的回退能力,可选择使用支持事务处理的存储引擎。


这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。可以选择适用于服务器、数据库和表的存储引擎,以便选择如何存储应用中各种类型的数据信息。如何检索这些信息以及需要数据结合什么性能和功能,选择合适的存储引擎将提供强大的灵活性。


3. 主要存储引擎介绍


MYSQL有多种存储引擎,如MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE等等,每种存储引擎有各自的优缺点,可以择优选择使用:


查看MySQL所支持的存储引擎,命令如下:


mysql> show engines;


MYISAM 存储引擎


MyISAM是MySQL 5.5之前的默认数据库引擎。拥有较高的插入,查询速度。提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务行级锁及外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。MyISAM会将表存储在两个文件在中:数据文件和索引文件,分别是.MYD和.MYI为扩展名。在数据不再进行修改操作时,可以对MyISAM表进行压缩,压缩后可以提高读能力,原因是减少了磁盘I/O。


INNODB存储引擎


InnoDB是支持事务的存储引擎,同时还支持外键、行级锁定。InnoDB是为处理巨大数据量时的最大性能设计。Innodb还可以通过使用MVCC来获取高并发性,是目前最流行的存储引擎。


MEMORY 存储引擎


Memory存储引擎将表中的数据存放在内存中。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。


ARCHIVE存储引擎


Archive引擎作用:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。有以下特点:


Ø archive存储引擎只支持insert和select操作,mysql5.1开始支持索引。使用zlib算法将数据行进行压缩后存储,压缩比率一般可达1:10


Ø archive存储引擎非常适用于存储归档数据,如日志信息。


Ø archive存储引擎使用行锁来实现高并发的插入操作。由于本身不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。


Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。


MERGE存储引擎


merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,MERGE表中并没有数据,对MERGE类型的表可以进行查询、更新、删除的操作,这些操作实际上是对内部的MyISAM表进行操作。对于对MERGE表进行的插入操作,是根据INSERT_METHOD子句定义的插入的表,可以有3个不同的值,first和last值使得插入操作被相应的作用在第一个或最后一个表上,不定义这个子句或者为NO,表示不能对这个MERGE表进行插入操作。可以对MERGE表进行drop操作,这个操作只是删除MERGE表的定义,对内部的表没有任何影响。MERGE在磁盘上保留2个以MERGE表名开头文件:.frm文件存储表的定义;.MRG文件包含组合表的信息,包括MERGE表由哪些表组成,插入数据时的依据。可以通过修改.MRG文件来修改MERGE表,但是修改后要通过flush table刷新。


NDB存储引擎


NDB存储引擎是一个集群存储引擎,类似于oracle的rac集群,不过与rac share everything结构不同的是,其结构是share nothing的集群结构,因此能提供更高级别的高可用性。NDB的特点:


Ø 数据全部放在内存中,从5.1版本开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并且通过添加ndb数据存储引擎节点(Data Node)可以线性地提高数据库性能,是高可用,高性能的集群系统。


Ø ndb存储引擎的连接操作(join)是在mysql数据库层完成的,而不是在存储引擎层完成的,这意味着复杂的连接操作需要巨大的网络开销,因此,查询速度很慢,这是ndb的瓶颈。


Ø Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。


BDB存储引擎


可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。


Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。


4. 选择合适的存储引擎


一般情况下,InnoDB都是正确的选择,除非需要用到某些InnoDB不具备的特性,并且没有其它办法可以替代,否则都应该优先选择InnoDB引擎。不建议混合使用多种存储引擎,因为有可能带来一些的问题。


如应用需要不同的存储引擎,可考虑以下几个因素:


事务:


如果应用需要事务支持,那么InnoDB(或者XtraDB)是目前最稳定并且经过验证的选择。


备份:


如果可以定期地关闭服务器来执行备份,那么备份的因素可以忽略。反之,如果需要在线热备份,那么选择InnoDB就是基本的要求。


崩溃恢复


MyISAM崩溃后发生损坏的概率比InnoDB要高很多,而且恢复速度也要慢。


特有的特性


如果一个存储引擎拥有一些关键的特性,同时却又缺乏一些必要的特性,那么有时候不得不做折中的考虑,或者在架构设计上做一些取舍。


作者:梁冠群新炬网络高级技术专家。


1. MYSQL受欢迎的原因


MYSQL作为一种关系型数据库管理系统,因其体积小、速度快、总体拥有成本低受到中小企业的热捧,开放源代码、支持多种存储引擎等特性更是让一般中小型网站的开发都选择MYSQL作为网站数据库。MYSQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用。


2. 存储引擎的概念


MYSQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,就能够获得额外的速度或者功能,从而改善应用的整体功能。


例如,如果在研究大量的临时数据,一般需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者为确保事务处理不成功时具备数据的回退能力,可选择使用支持事务处理的存储引擎。


这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。可以选择适用于服务器、数据库和表的存储引擎,以便选择如何存储应用中各种类型的数据信息。如何检索这些信息以及需要数据结合什么性能和功能,选择合适的存储引擎将提供强大的灵活性。


3. 主要存储引擎介绍


MYSQL有多种存储引擎,如MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE等等,每种存储引擎有各自的优缺点,可以择优选择使用:


查看MySQL所支持的存储引擎,命令如下:


mysql> show engines;


MYISAM 存储引擎


MyISAM是MySQL 5.5之前的默认数据库引擎。拥有较高的插入,查询速度。提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务行级锁及外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。MyISAM会将表存储在两个文件在中:数据文件和索引文件,分别是.MYD和.MYI为扩展名。在数据不再进行修改操作时,可以对MyISAM表进行压缩,压缩后可以提高读能力,原因是减少了磁盘I/O。


INNODB存储引擎


InnoDB是支持事务的存储引擎,同时还支持外键、行级锁定。InnoDB是为处理巨大数据量时的最大性能设计。Innodb还可以通过使用MVCC来获取高并发性,是目前最流行的存储引擎。


MEMORY 存储引擎


Memory存储引擎将表中的数据存放在内存中。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。


ARCHIVE存储引擎


Archive引擎作用:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。有以下特点:


Ø archive存储引擎只支持insert和select操作,mysql5.1开始支持索引。使用zlib算法将数据行进行压缩后存储,压缩比率一般可达1:10


Ø archive存储引擎非常适用于存储归档数据,如日志信息。


Ø archive存储引擎使用行锁来实现高并发的插入操作。由于本身不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。


Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。


MERGE存储引擎


merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,MERGE表中并没有数据,对MERGE类型的表可以进行查询、更新、删除的操作,这些操作实际上是对内部的MyISAM表进行操作。对于对MERGE表进行的插入操作,是根据INSERT_METHOD子句定义的插入的表,可以有3个不同的值,first和last值使得插入操作被相应的作用在第一个或最后一个表上,不定义这个子句或者为NO,表示不能对这个MERGE表进行插入操作。可以对MERGE表进行drop操作,这个操作只是删除MERGE表的定义,对内部的表没有任何影响。MERGE在磁盘上保留2个以MERGE表名开头文件:.frm文件存储表的定义;.MRG文件包含组合表的信息,包括MERGE表由哪些表组成,插入数据时的依据。可以通过修改.MRG文件来修改MERGE表,但是修改后要通过flush table刷新。


NDB存储引擎


NDB存储引擎是一个集群存储引擎,类似于oracle的rac集群,不过与rac share everything结构不同的是,其结构是share nothing的集群结构,因此能提供更高级别的高可用性。NDB的特点:


Ø 数据全部放在内存中,从5.1版本开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并且通过添加ndb数据存储引擎节点(Data Node)可以线性地提高数据库性能,是高可用,高性能的集群系统。


Ø ndb存储引擎的连接操作(join)是在mysql数据库层完成的,而不是在存储引擎层完成的,这意味着复杂的连接操作需要巨大的网络开销,因此,查询速度很慢,这是ndb的瓶颈。


Ø Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。


BDB存储引擎


可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。


Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。


4. 选择合适的存储引擎


一般情况下,InnoDB都是正确的选择,除非需要用到某些InnoDB不具备的特性,并且没有其它办法可以替代,否则都应该优先选择InnoDB引擎。不建议混合使用多种存储引擎,因为有可能带来一些的问题。


如应用需要不同的存储引擎,可考虑以下几个因素:


事务:


如果应用需要事务支持,那么InnoDB(或者XtraDB)是目前最稳定并且经过验证的选择。


备份:


如果可以定期地关闭服务器来执行备份,那么备份的因素可以忽略。反之,如果需要在线热备份,那么选择InnoDB就是基本的要求。


崩溃恢复


MyISAM崩溃后发生损坏的概率比InnoDB要高很多,而且恢复速度也要慢。


特有的特性


如果一个存储引擎拥有一些关键的特性,同时却又缺乏一些必要的特性,那么有时候不得不做折中的考虑,或者在架构设计上做一些取舍。

上一篇:实战mongodb3.06分片与复体集
下一篇:MySQL 5.7的原生JSON数据类型使用介绍