mysql存储引擎的种类与差别(innodb与myisam)

查找数据库的存数引擎:

show engines

show variables like '%storage_engine%'

更改数据库的引擎更改配置文件/etc/my.cnf

改动default-storage-engine=InnoDB(须要更改的存储引擎)。然后重新启动数据库

service mysqld restart 

alter table engine=innodb

存储引擎说白了就是怎样存储数据、怎样为存储的数据建立索引和怎样更新、查询数据等技术的实现方法。

由于在关系数据库中数据的存储是以表的形式存储的。所以存储引擎也能够称为表类型(即存储和操作此表的类型)

下述存储引擎是最经常使用的:

MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其它应用环境下最常使用的MySQL存储引擎之中的一个。注意。通过更改STORAGE_ENGINE配置变量。可以方便地更改MySQLserver的默认存储引擎。

InnoDB:用于事务处理应用程序,具有众多特性。包含ACID事务支持。

BDB:可替代InnoDB的事务引擎。支持COMMITROLLBACK和其它事务特性。

Memory:将全部数据保存在RAM中,在须要高速查找引用和其它类似数据的环境下,可提供极快的訪问。

Merge:同意MySQL DBA或开发者将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

Archive:为大量非常少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方式。

Federated:可以将多个分离的MySQLserver链接起来,从多个物理server创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

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

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

请记住,对于整个server或方案,你并不一定要使用同样的存储引擎。你能够为方案中的每一个表使用不同的MySQL存储引擎,这点非常重要。



下面主要讲叙myisam 与innodb

MyISAM存储引擎

       MyISAM是 默认存储引擎。

它基于更老的ISAM代码,但有非常多实用的扩展。MyISAM存储引擎的一些特征:
·      全部数据值先存储低字节。这使得数据机和操作系统分离。

二进制轻便性的唯一要求是机器使用补码(如近期20年的机器有的一样)和IEEE浮点格式(在主流机器中也全然是主导的)。唯一不支持二进制兼容性的机器是嵌入式系统。这些系统有时使用特殊的处理器。
·      先存储数据低字节并不严重地影响速度;数据行中的字节通常是未联合的,从一个方向读未联合的字节并不比从反向读更占用很多其他的资源。server上的获取列值的代码与其他代码相比并不显得时间紧。


·      大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。
·      当把删除和更新及插入混合的时候。动态尺寸的行更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块来自己主动完毕。


·      每一个MyISAM表最大索引数是64。 这能够通过又一次编译来改变。每一个索引最大的列数是16个。
·      最大的键长度是1000字节。这也能够通过编译来改变。

对于键长度超过250字节的情况,一个超过1024字节的的键块被用上。


·      BLOB和TEXT列能够被索引。
·      NULL值被同意在索引的列中。这个占每一个键的0-1个字节。


·      全部数字键值以高字节为先被存储以同意一个更高地索引压缩。


·      当记录以排好序的顺序插入(就像你使用一个AUTO_INCREMENT列之时)。索引树被劈开以便高节点仅包括一个键。

这改善了索引树的空间利用率。


·      每表一个AUTO_INCREMEN列的内部处理。MyISAM为INSERT和UPDATE操作自己主动更新这一 列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。

(当AUTO_INCREMENT列被定义为多列索 引的最后一列,能够出现重使用从序列顶部删除的值的情况 )。AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置。
·      假设数据文件里间的表没有自由块了,在其他线程从表读的同一时候,你能够INSERT新行到表中。(这被认识为并发操作 )。自由块的出现是作为删除行的结果。或者是用比当前内容多的数据对动态长度行更新的结果。当全部自由块被用完(填满),未来的插入又变成并发。
·      你能够把数据文件和索引文件放在不同文件夹,用DATA DIRECTORY和INDEX DIRECTORY选项CREATE TABLE以获得更高的速度。请參阅13.1.5节。“CREATE TABLE语法”。
·      每一个字符列能够又不同的字符集。
·      在MyISAM索引文件中又一个标志,它表明表是否被正确关闭。假设用--myisam-recover选项启动mysqld。MyISAM表在打开得时候被自己主动检查,假设被表被不恰当地关闭。就修复表。
·      假设你用--update-state选项执行myisamchk,它标注表为已检查。

myisamchk --fast仅仅检查那些没有这个标志的表。
·      myisamchk --analyze为部分键存储统计信息。也为整个键存储统计信息。
·      myisampack能够打包BLOB和VARCHAR列。

MyISAM也支持下列特征:
·         支持true VARCHAR类型;VARCHAR列以存储在2个字节中的长度来開始。
·         有VARCHAR的表能够有固定或动态记录长度。
·         VARCHAR和CHAR列能够多达64KB。


·         一个被搞乱的已计算索引对可对UNIQUE来使用。这同意你在表内不论什么列的合并上有UNIQUE。

(虽然如此,你不能在一个UNIQUE已计算索引上搜索)。

InnoDB存储引擎
        InnoDB给MySQL提供 了具有提交。回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。

InnoDB锁定在行级而且也在SELECT语句提供一个Oracle风格一致的非 锁定读。这些特色添加 了多用户部署和性能。

没有在InnoDB中扩大锁定的须要,由于在InnoDB中行级锁定适合很小的空间。

InnoDB也支持FOREIGN KEY强制。在SQL查询中,你能够自由地将InnoDB类型的表与其他MySQL的表的类型混合起来。甚至在同一个查询中也能够混合。
        InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是不论什么其他基于磁盘的关系数据库引擎所不能匹敌的。
        InnoDB存储引擎被全然与MySQLserver整合,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次插入/更新的负荷。


InnoDB和MyISAM的差别
差别概述:
MyISAM 是MySQL中默认的存储引擎。一般来说不是有太多人关心这个东西。

决定使用什么样的存储引擎是一个非常tricky的事情,可是还是值我们去研究一下,这里的文章仅仅考虑 MyISAM 和InnoDB这两个,由于这两个是最常见的。

以下先让我们回答一些问题:

你的数据库有外键吗?
你须要事务支持吗?
你须要全文索引吗?
你常常使用什么样的查询模式?
你的数据有多大?
 

思考上面这些问题能够让你找到合适的方向。但那并非绝对的。

假设你须要事务处理或是外键,那么InnoDB 可能是比較好的方式。假设你须要全文索引。那么通常来说 MyISAM是好的选择。由于这是系统内建的,然而。我们事实上并不会常常地去測试两百万行记录。

所以。就算是慢一点。我们能够通过使用Sphinx从 InnoDB中获得全文索引。
数据的大小,是一个影响你选择什么样存储引擎的重要因素。大尺寸的数据集趋向于选择InnoDB方式,由于其支持事务处理和故障恢复。数据库的在小 决定了故障恢复的时间长短,InnoDB能够利用事务日志进行数据恢复,这会比較快。

而MyISAM可能会须要几个小时甚至几天来干这些事。InnoDB 仅仅须要几分钟。
您操作数据库表的习惯可能也会是一个对性能影响非常大的因素。

比方: COUNT() 在 MyISAM 表中会非常快。而在InnoDB 表下可能会非常痛苦。而主键查询则在InnoDB下会相当相当的快,但须要小心的是假设我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,可是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。
所以,究竟你检使用哪一个呢?依据经验来看,假设是一些小型的应用或项目,那么MyISAM 或许会更适合。

当然。在大型的环境下使用MyISAM 也会有非常大成功的时候,但却不总是这种。假设你正在计划使用一个超大数据量的项目,并且须要事务处理或外键支持,那么你真的应该直接使用InnoDB方 式。

但须要记住InnoDB 的表须要很多其它的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。



差别总结:
1.InnoDB不支持FULLTEXT类型的索引。


2.InnoDB 中不保存表的详细行数。也就是说,运行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM仅仅要简单的读出保存好的行数就可以。注意的是,当count(*)语句包括 where条件时。两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段。InnoDB中必须包括仅仅有该字段的索引,可是在MyISAM表中,能够和其它字段一起建立联合索引。
4.DELETE FROM table时。InnoDB不会又一次建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的。解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,可是对于使用的额外的InnoDB特性(比如外键)的表不适用。



另外,InnoDB表的行锁也不是绝对的,假设在运行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表相同会锁全表。比如update table set num=1 where name like “%aaa%”

 
remap
提升InnoDB性能的方法:
MyISAM和InnoDB存储引擎性能区别并非非常大。针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,假设设置为1的话。那么每次插入数据的时候都会自己主动提交,导致性能急剧下降。应该是跟刷新日志有关系,设置为0效率可以看到明显提升。当然,同 样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size可以提升InnoDB的性能,可是我測试发现没有特别明显 的提升。

基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了。由于InnoDB自身非常多良好的特点。比方事务支持、存储 过程、视图、行级锁定等等,在并发非常多的情况下,相信InnoDB的表现肯定要比MyISAM强非常多,当然,对应的在my.cnf中的配置也是比較关键 的。良好的配置,可以有效的加速你的应用。

不论什么一种表都不是万能的,仅仅用恰当的针对业务类型来选择合适的表类型,才干最大的发挥MySQL的性能优势



原文地址:https://www.cnblogs.com/liguangsunls/p/7285788.html