[img]http://img.bitscn.com/upimg/allimg/c141118/14163211bF310-1CV0.jpg[/img]
MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。
下面我们来认识一下MySQL各表存储引擎的特点:
[align=center][size=medium][color=red]InnoDB存储引擎[/color][/size][/align]
[b]特点:[/b]
[color=red] 1,支持事务,主要面向在线事务处理(OLTP)方面的应用。
2,行锁设计,支持外键,并支持orcle的非锁定读,即默认情况下读取操作不加锁。
3,第三方存储引擎,被orcle收购。
4,windows版本默认存储引擎,其他系统mysql默认存储引擎为MyISAM。[/color]
[b]设计理念:[/b]
[color=red]1,InnoDB默认将数据放到一个逻辑的表空间中,这个表空间就像黑盒子一样由InnoDB自身进行管理。从mysql4.1开始,它可以将每个 InnoDB存储引擎的表单独存放到一个独立的ibd文件中。与orcle类似,InnoDB存储引擎同样可以使用裸设备(row disk)来建立其表空间。
2,InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了sql标准的4种隔离级别,默认为REPEATABLE级别。同时 使用一种next-key-locking的策略来避免幻读(phantom)。除此之外,InnoDB存储引擎还提供插入缓存(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用的功能。[/color]
[img]http://attach.dataguru.cn/attachments/forum/201408/30/231337wrbs3xpr5kbs3ryh.png[/img]
[img]http://images2015.cnblogs.com/blog/613276/201509/613276-20150903142639466-1340427708.png[/img]
InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者 或者两者,那你就要被迫使用后两个引擎中的一个了。
MySQL 官方对InnoDB是这样解释的:InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。 Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的
[align=center][size=medium][color=red][b] ISAM[/b][/color][/size][/align]
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实 时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
[b][size=medium][color=red][align=center]MyISAM存储引擎[/align][/color][/size][/b]
[b]特点:[/b]
[color=red]1,不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,对于一些OLAP(online analytical processing,在线分析处理)操作速度快
2,官方存储引擎,除windows版本外,是所有mysql版本的默认存储引擎。[/color]
[b]设计理念:[/b]
[color=red]1,myisam存储引擎表由myd和myi组成。myd用来存放数据文件,myi用来存放索引文件,可以通过myisampack工具进一步压缩 数据文件,因为该工具使用huffman编码静态算法来压缩数据。因此,使用该工具压缩后的表是只读的,当然也可以通过myisampack来解压数据文 件。
2,mysql5.0之前,myisam默认支持的表大小为4g,如果需要支持大于4g的myisam表时,则需要制定Max_Rows和AVG_ROW_LENGTH属性。从mysql5.0版本开始,myisam默认支持256T的单表数据,足够满足一般应用的需求。
3,对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。这与其他使用LRU算法缓存数据的大部 分数据库大不相同。此外,在mysql5.1.23版本之前,无论是在32b或64b的操作系统环境中,缓存索引的缓存区最大只能设置为4g,在之后的版 本中,64位系统可以支持大于4g的索引缓存区。[/color]
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
[align=center][size=medium][color=red][b]HEAP[/b][/color][/size][/align]
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。
[align=center][size=medium][color=red][b]NDB存储引擎[/b][/color][/size][/align]
NDB存储引擎是一个集群存储引擎,类似于orcle的rac集群,不过与rac share everything结构不同的是,其结构是share nothing的集群结构,因此能提供更高级别的高可用性。
[b] 特点:[/b]
[color=red]1,数据全部放在内存中,从5.1版本开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并且通过添加ndb数据存储引擎节点(Data Node)可以线性地提高数据库性能,是高可用,高性能的集群系统。
2,ndb存储引擎的连接操作(join)是在mysql数据库层完成的,而不是在存储引擎层完成的,这意味着复杂的连接操作需要巨大的网络开销,因此,查询速度很慢,这是ndb的瓶颈。[/color]
[align=center][size=medium][color=red][b]Memory存储引擎[/b][/color][/size][/align]
memory存储引擎(之前称为heap存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都会消失。它非常适合用于存放临时数据的临时表,以及数据仓库的纬度表,默认使用哈希索引,而不是b+树索引。
使用限制:memory存储引擎只支持表锁,并发性能较差,并且不支持text和blob列类型。最重要的是,存放变长字段(varchar)时, 按照定常字段的方式进行存放,造成内存浪费。此外,mysql数据库使用临时表存放查询的中间结果集(intermediate result)。如果中间结果集大于memory存储引擎表的容量设置,或中间结果集含有text或blob字段,则mysql数据库会把其转换到 myisam存储引擎表而存放到磁盘。由于myisam不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
[align=center][size=medium][color=red][b]Archive存储引擎[/b][/color][/size][/align]
[b]特点:[/b]
[color=red]1,archive存储引擎只支持insert和select操作,mysql5.1开始支持索引。使用zlib算法将数据行进行压缩后存储,压缩比率一般可达1:10
2,archive存储引擎非常适用于存储归档数据,如日志信息。
3,archive存储引擎使用行锁来实现高并发的插入操作。由于本身不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。[/color]
[align=center][size=medium][color=red][b] Maria存储引擎[/b][/color][/size][/align]
maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的myisam存储引擎,从而成为mysql的默认存储引擎。
[b]特点:[/b]
[color=red]1,缓存数据和索引文件,行锁设计,提供mvcc功能,支持事务和非事务安全的选项支持,及更好的blob字段类型的处理性能。[/color]
MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。
下面我们来认识一下MySQL各表存储引擎的特点:
[align=center][size=medium][color=red]InnoDB存储引擎[/color][/size][/align]
[b]特点:[/b]
[color=red] 1,支持事务,主要面向在线事务处理(OLTP)方面的应用。
2,行锁设计,支持外键,并支持orcle的非锁定读,即默认情况下读取操作不加锁。
3,第三方存储引擎,被orcle收购。
4,windows版本默认存储引擎,其他系统mysql默认存储引擎为MyISAM。[/color]
[b]设计理念:[/b]
[color=red]1,InnoDB默认将数据放到一个逻辑的表空间中,这个表空间就像黑盒子一样由InnoDB自身进行管理。从mysql4.1开始,它可以将每个 InnoDB存储引擎的表单独存放到一个独立的ibd文件中。与orcle类似,InnoDB存储引擎同样可以使用裸设备(row disk)来建立其表空间。
2,InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了sql标准的4种隔离级别,默认为REPEATABLE级别。同时 使用一种next-key-locking的策略来避免幻读(phantom)。除此之外,InnoDB存储引擎还提供插入缓存(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用的功能。[/color]
[img]http://attach.dataguru.cn/attachments/forum/201408/30/231337wrbs3xpr5kbs3ryh.png[/img]
[img]http://images2015.cnblogs.com/blog/613276/201509/613276-20150903142639466-1340427708.png[/img]
InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者 或者两者,那你就要被迫使用后两个引擎中的一个了。
MySQL 官方对InnoDB是这样解释的:InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。 Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的
[align=center][size=medium][color=red][b] ISAM[/b][/color][/size][/align]
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实 时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
[b][size=medium][color=red][align=center]MyISAM存储引擎[/align][/color][/size][/b]
[b]特点:[/b]
[color=red]1,不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,对于一些OLAP(online analytical processing,在线分析处理)操作速度快
2,官方存储引擎,除windows版本外,是所有mysql版本的默认存储引擎。[/color]
[b]设计理念:[/b]
[color=red]1,myisam存储引擎表由myd和myi组成。myd用来存放数据文件,myi用来存放索引文件,可以通过myisampack工具进一步压缩 数据文件,因为该工具使用huffman编码静态算法来压缩数据。因此,使用该工具压缩后的表是只读的,当然也可以通过myisampack来解压数据文 件。
2,mysql5.0之前,myisam默认支持的表大小为4g,如果需要支持大于4g的myisam表时,则需要制定Max_Rows和AVG_ROW_LENGTH属性。从mysql5.0版本开始,myisam默认支持256T的单表数据,足够满足一般应用的需求。
3,对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。这与其他使用LRU算法缓存数据的大部 分数据库大不相同。此外,在mysql5.1.23版本之前,无论是在32b或64b的操作系统环境中,缓存索引的缓存区最大只能设置为4g,在之后的版 本中,64位系统可以支持大于4g的索引缓存区。[/color]
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
[align=center][size=medium][color=red][b]HEAP[/b][/color][/size][/align]
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。
[align=center][size=medium][color=red][b]NDB存储引擎[/b][/color][/size][/align]
NDB存储引擎是一个集群存储引擎,类似于orcle的rac集群,不过与rac share everything结构不同的是,其结构是share nothing的集群结构,因此能提供更高级别的高可用性。
[b] 特点:[/b]
[color=red]1,数据全部放在内存中,从5.1版本开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并且通过添加ndb数据存储引擎节点(Data Node)可以线性地提高数据库性能,是高可用,高性能的集群系统。
2,ndb存储引擎的连接操作(join)是在mysql数据库层完成的,而不是在存储引擎层完成的,这意味着复杂的连接操作需要巨大的网络开销,因此,查询速度很慢,这是ndb的瓶颈。[/color]
[align=center][size=medium][color=red][b]Memory存储引擎[/b][/color][/size][/align]
memory存储引擎(之前称为heap存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都会消失。它非常适合用于存放临时数据的临时表,以及数据仓库的纬度表,默认使用哈希索引,而不是b+树索引。
使用限制:memory存储引擎只支持表锁,并发性能较差,并且不支持text和blob列类型。最重要的是,存放变长字段(varchar)时, 按照定常字段的方式进行存放,造成内存浪费。此外,mysql数据库使用临时表存放查询的中间结果集(intermediate result)。如果中间结果集大于memory存储引擎表的容量设置,或中间结果集含有text或blob字段,则mysql数据库会把其转换到 myisam存储引擎表而存放到磁盘。由于myisam不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
[align=center][size=medium][color=red][b]Archive存储引擎[/b][/color][/size][/align]
[b]特点:[/b]
[color=red]1,archive存储引擎只支持insert和select操作,mysql5.1开始支持索引。使用zlib算法将数据行进行压缩后存储,压缩比率一般可达1:10
2,archive存储引擎非常适用于存储归档数据,如日志信息。
3,archive存储引擎使用行锁来实现高并发的插入操作。由于本身不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。[/color]
[align=center][size=medium][color=red][b] Maria存储引擎[/b][/color][/size][/align]
maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的myisam存储引擎,从而成为mysql的默认存储引擎。
[b]特点:[/b]
[color=red]1,缓存数据和索引文件,行锁设计,提供mvcc功能,支持事务和非事务安全的选项支持,及更好的blob字段类型的处理性能。[/color]