写在前面数据库
MySQL,Oracle,SqlServer都是在关系型数据库中都占有一席之地,MySQL数据库也被称为业内最普遍使用的开源数据库之一,而插件式存储引擎的是其最重要的特色之一,了解其存储引擎能更方便的使用MySQL数据库的特性。
缓存
本节目标安全
了解MySQL插件式存储引擎服务器
掌握MyISAM和InnoDB存储引擎的区别并发
插件式存储引擎是什么?ide
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存储引擎的区别性能
在说二者之间的区别以前,首先要弄清楚一个概念,存储引擎是表级别的概念,因此才成为表类型,每建立一张表均可以指定所使用的存储引擎,可是并不建议每张表都交叉使用不一样的引擎。
spa
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最支持温备与冷备。崩溃后没法安全恢复。因为MyISAM引擎不支持热备,因此在不少须要热备的应用场景中极不适用,近乎到了被抛弃的境地。
6 其余
InnoDB支持自适应的hash索引,使用MVCC来支持高并发。在性能方面,支持预读操做,内存数据缓冲,内存索引缓存,插入操做缓冲区等。InnoDB引擎支持延迟索引更新,和表压缩等特性。
近年来,InnoDB已有取代MyISAM之趋势。MySQL与mariadb的默认存储引擎已使用InnoDB。