MySQL存储引擎MyISAM与InnoDB的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储引擎MyISAM与InnoDB的区别相关的知识,希望对你有一定的参考价值。

写在前面


    mysql,Oracle,SqlServer都是在关系型数据库中都占有一席之地,MySQL数据库也被称为业内最广泛使用的开源数据库之一,而插件式存储引擎的是其最重要的特点之一,了解其存储引擎能更方便的使用MySQL数据库的特性。

本节目标

  • 了解MySQL插件式存储引擎

  • 掌握MyISAM和InnoDB存储引擎的区别

 

插件式存储引擎是什么?


   MySQL 的存储引擎为插件式存储引擎,即允许MySQL 官方提供,又允许第三方通过MySQL的API接口自行开发存储引擎。MySQL中使用各种不同的技术,将数据放在不同的文件系统中进行存储,例如针对内存数据库(MEMORY引擎)则将数据直接存储在内存中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的功能和 能力,通过选择不同的技术,用户能够获得额外的速度或者功能,从而改善应用的整体功能。例如,如果要研究大量的临时数据,也许就需要使用内存存储引擎,内存存储引擎能够在内存中存储所有的表格数据,帮助用户完成应用。又或者,用户也许需要一个支持事务处理的数据库,以确保事务处理不成功时数据的回退能力,这就需要使用支持事务处理的存储引擎(InnoDB引擎)。这些不同的技术以及配套的相关功能在MySQL中被称做存储引擎(也称做表类型)。MySQL默认配置了许多不同的 存储引擎,可以预先设置或者在MySQL服务器中启用。可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储信息、如何检索这些信息以及需要数据结合什么性能和功能的时候提供最大的灵活性。MySQL5.5之后提供10种存储引擎,MEMORY,CSV,PERFORMANCE_SCHEMA,BLACKHOLE,MyISAM,MRG_MYISAM,ARCHIVE,FEDERATED,InnoDB,Aria。在MySQL的众多存储引擎中InoDB与MyISAM为使用最多的两个存储引擎。所以本文也主要讲述这两个存储引擎之间的区别。

 

MyISAM和InnoDB存储引擎的区别


    在说两者之间的区别之前,首先要弄清楚一个概念,存储引擎是表级别的概念,所以才成为表类型,每创建一张表都可以指定所使用的存储引擎,但是并不建议每张表都交叉使用不同的引擎。

 

1 数据文件

MyISAM存储引擎每张表都创建三个文件

table_name.frm

存储表的结构

table_name.MYD

存储数据

table_name.MYI

存储索引

    InnoDB对把数据存储与表空间中,分为两种方式:所有InonoDB表的数据和索引放置于同一个表空间中和每个表单独使用一个表空间存储表的数据和索引。

当所有表位于同一表空间中,其数据文件存于数据目录下以ibddata[#]来命名。这种方式不利于管理和备份恢复。所以一般使用第二种方式,每张表创建单独的表空间,用来实现InnoDB所支持的高级特性,比如单表导入导出,单标备份等功能。数据文件为

table_name.ibd

存储数据和索引

table_name.frm

存储表结构定义

 

2 事务性

    MyISAM类型的表强调性能,其执行速度比InnoDB类型更快但不提供事务的支持,也不支持外键,适用于大量select操作的应用场景。InnoDB支持事务,并把事务分为四个隔离级别,READ-UNCOMMITTED:读未提交容易发生脏读;READ-COMMITTED:读提交,该级别不可重复读;REPEATABLE-READ:可重复读,该级别容易发生幻读;SERIALIZABLE:串行化;默认级别为REPEATABLE-READ。适合对事务要求较高的场景中,较适用于处理大量短期事务。

3 锁粒度

    MyISAM的锁粒度较为粗糙,为表级锁。而InnoDB为行级锁,并使用间隙锁来防止幻读。当然InnoDB的行级锁也并非绝对,当SQL语句在执行过程中在不能确定扫描范围时也会对整张表进行锁定,例如updatestudents set sex=”M” where name like “%aaa%”;

4 索引类型

    InnoDB为聚集索引,辅助索引,MyISAM为非聚集索引并且支持全文索引(fulltext index)。

5 备份策略

       InnoDB支持热备、温备、冷备。崩溃后可安全恢复。MyISAM最支持温备与冷备。崩溃后无法安全恢复。

6 其他

    InnoDB支持自适应的hash索引,使用MVCC来支持高并发。在性能方面,支持预读操作,内存数据缓冲,内存索引缓存,插入操作缓冲区等。InnoDB引擎支持延迟索引更新,和表压缩等特性。

 

近年来,InnoDB已有取代MyISAM之趋势。MySQL与mariadb的默认存储引擎已使用InnoDB。


本文出自 “Keep simple keep stupid” 博客,请务必保留此出处http://yangzhiheng.blog.51cto.com/11586378/1980892

以上是关于MySQL存储引擎MyISAM与InnoDB的区别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储引擎MyISAM与InnoDB的区别

MySQL存储引擎--MyISAM与InnoDB区别

MySQL存储引擎--MyISAM与InnoDB区别

MySQL存储引擎--MyISAM与InnoDB区别

MySQL存储引擎--MyISAM与InnoDB区别

Mysql存储引擎中InnoDB与Myisam的区别