MySQL存储引擎MyISAM与InnoDB区别总结整理

 

1. MySQL默认存储引擎的变迁html

    在MySQL 5.5以前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5以后的版本中,默认的搜索引擎变动为InnoDB。数据库

2. MyISAM与InnoDB存储引擎的主要特色缓存

    1).MyISAM存储引擎的特色是:表级锁、不支持事务和支持全文索引,适合一些CMS内容管理系统做为后台数据库使用,可是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;安全

    2).InnoDB存储引擎的特色是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4之后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具备提交、服务器

                                                     回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率多是任何其余基于磁盘的关系数据库引擎所不能匹敌的。并发

    注意:性能

    InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能肯定要扫描的范围,InnoDB表一样会锁全表(锁完之后,判断不符合条件的会逐步解锁),测试

    例如update table set num=1 where name like “a%”。搜索引擎

     两种类型最主要的差异就是InnoDB支持事务处理与外键和行级锁。而MyISAM不支持。因此MyISAM每每就容易被人认为只适合在小项目中使用。操作系统

3. MyISAM与InnoDB性能测试

    随着CPU核数的增长,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制下降了读和写的吞吐量。

4. 事务支持与否

    MyISAM是一种非事务性的引擎,使得MyISAM引擎的MySQL能够提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用;

    InnoDB是事务安全的;事务是一种高级的处理方式,如在一些列增删改中只要哪一个出错还能够回滚还原,而MyISAM就不能够了。 

5. MyISAM与InnoDB构成上的区别

    1).每一个MyISAM在磁盘上存储成三个文件:

        第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。 

       第二个文件是数据文件,其扩展名为.MYD (MYData)。 

       第三个文件是索引文件,其扩展名是.MYI (MYIndex)。

   2).基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操做系统文件的大小,通常为 2GB。

6. MyISAM与InnoDB表锁和行锁的解释

    MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对MyISAM表进行读操做时,它不会阻塞其余用户对同一表的读请求,但会阻塞对同一表的写操做;

    而对MyISAM表的写操做,则会阻塞其余用户对同一表的读和写操做。

    InnoDB行锁是经过给索引项加锁来实现的,即只有经过索引条件检索数据,InnoDB才使用行级锁,不然将使用表锁!行级锁在每次获取锁和释放锁的操做须要消耗比表锁更多的资源。在InnoDB两个事务发生死锁的

     时候,会计算出每一个事务影响的行数,而后回滚行数少的那个事务。当锁定的场景中不涉及Innodb的时候,InnoDB是检测不到的。只能依靠锁定超时来解决。

7. 是否保存数据库表中表的具体行数

     InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。

     注意的是,当count(*)语句包含where条件时,两种表的操做是同样的。也就是 上述“6”中介绍到的InnoDB使用表锁的一种状况。

8. 如何选择:

    MyISAM适合:

    1). 作不少count 的计算;

    2). 插入不频繁,查询很是频繁,若是执行大量的SELECT,MyISAM是更好的选择;

    3). 没有事务。

    InnoDB适合:

    1). 可靠性要求比较高,或者要求事务;

    2). 表更新和查询都至关的频繁,而且表锁定的机会比较大的状况指定数据引擎的建立;

    3). 若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;

    4).DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的 删除;

   5).LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。

9. 其余区别:

    1). 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引。

    2). DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。

    3). LOAD TABLE FROMMASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。

    4). 清空整个表时,InnoDB是一行一行的删除,效率很是慢。MyISAM则会重建表。

    5). 对于自增加的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中能够和其余字段一块儿创建联合索引。

    6). InnoDB存储引擎被彻底与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它本身的缓冲池。

         要注意,建立每一个表格的代码是相同的,除了最后的 TYPE参数,这一参数用来指定数据引擎。

原文:http://www.javashuo.com/article/p-hbufqghd-ek.html

相关文章
相关标签/搜索