MySQL 两种引擎的区别

马谦马谦马谦 MySQL评论289字数 1405阅读 4 分 41 秒阅读模式

一、区别

区别一:MyISAM 是非事务安全的,InnoDB 是事务安全的

  • 事务安全的特点为更安全,遇到问题会自动恢复或从备份加事务日志回复,如果更新失败,你的所有改变都变回原来。
  • 非事务安全的优点为更快,所需的磁盘空间更小,执行更新时需要的内存更小,但是所有发生的改变都是永久的。

InnoDB 用于事务处理,具有 ACID(原子性,一致性,隔离性,持久性) 事务支持等特性,如果在应用中大量使用 insert 和 update 操作,应选用 InnoDB 。

区别二:MyISAM 锁的粒度是表级的,而 InnoDB 支持行级锁

数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源。 为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别。 锁定在较小的粒度 (例如行) 可以提高并发度,但开销较高,因为如果锁定了许多行,则需要持有更多的锁。 锁定在较大的粒度 (例如表) 会降低了并发度,因为锁定整个表限制了其他事务对表中任意部分的访问。 但其开销较低,因为需要维护的锁较少。

区别三:MyISAM 支持全文类型索引,而 InnoDB(以前) 不支持全文索引

  • 主键索引:主键是一种唯一性索引,但它必须指定为 PRIMARY KEY,每个表只能有一个主键。
  • 唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空。
  • 普通索引:基本的索引类型,值可以为空,没有唯一性的限制。
  • 全文索引:全文索引的索引类型为 FULLTEXT 。全文索引可以在 varchar 、 char 、 text 类型的列上创建。可以通过 ALTER TABLE 或 CREATE INDEX 命令创建。对于大规模的数据集,通过 ALTER TABLE(或者 CREATE INDEX) 命令创建全文索引要比把记录插入带有全文索引的空表更快。 MyISAM 支持全文索引,InnoDB 在 mysql5.6 之后支持了全文索引。

区别四:InnoDB 支持外键,MyISAM 不支持

区别五:MyISAM 表保存成文件形式,跨平台使用更加方便

二、应用场景

MyISAM 是 MySQL 默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当 INSERT(插入) 或 UPDATE(更新) 数据时即写操作需要锁定整个表,效率便会低一些。不过和 Innodb 不同,MyISAM 中存储了表的行数,于是 SELECT COUNT(*) FROM TABLE 时只需要直接读取已经保存好的值而不需要进行全表扫描。同时 MyISAM 提供高速存储和检索以及全文搜索能力,如果在应用中执行大量 select 操作,应该选择 MyISAM 。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么 MyISAM 也是很好的选择。

Innodb 引擎提供了对数据库 ACID 事务的支持,并且实现了 SQL 标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于 MySQL 后台的完整数据库系统,MySQL 运行时 Innodb 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持 FULLTEXT 类型的索引,而且它没有保存表的行数,当 SELECT COUNT(*) FROM TABLE 时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用 Innodb 引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表。

  最后更新:2020-1-12
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2019 年 5 月 4 日 11:33:24
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/mysql/the-difference-between-innodb-and-myisam.html
MySQL中的B+树索引和哈希索引 MySQL

MySQL 中的 B+树索引和哈希索引

一、为什么要使用索引 索引是存储引擎用于快速找到记录的一种数据结构。索引对于数据库良好的性能十分关键,尤其是表中的数据量越来越大时,索引对性能的影响十分明显。 《高性能 MySQL 》中对索引的评价是:索...
数据库中的多版本并发控制(MVCC) MySQL

数据库中的多版本并发控制 (MVCC)

一、概述 事务的出现给并发带来了巨大的便利性,它的 ACID 特性使得数据在并发时更加可靠。但是对于事务而言,它也会导致出现第一类丢失更新、第二类丢失更新、脏读、不可重复读以及幻读的问题,当然又出现了多种...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证
加载失败