MySQL存储引擎MyISAM和InnoDB区别

一、什么是存储引擎

show engines;

二、MyISAM和InnoDB区别

5.5版之前,MyISAM是MySQL的默认数据库引擎。它的性能很好,提供了包括全文索引、压缩、空间函数等大量特性,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),并此后版本默认的存储引擎为InnoDB。

两者的区别:

  1. 是否支持行级锁 : MyISAM 只支持表级锁,InnoDB 支持行级锁和表级锁,默认为行级锁。
  2. 是否支持事务和崩溃后的安全恢复: MyISAM 每次查询具有原子性,执行数度比InnoDB快,但不提供事务支持。InnoDB 提供事务支持,外键等高级数据库功能,具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))操作。
  3. 是否支持外键: MyISAM不支持,而InnoDB支持。
  4. 是否支持MVCC :仅 InnoDB 支持。应对高并发事务, MVCC比单纯的加锁更高效;MVCC只在 READ COMMITTEDREPEATABLE READ 两个隔离级别下工作;MVCC可以使用乐观(optimistic)锁和悲观(pessimistic)锁来实现,各数据库中MVCC实现并不统一。

在某些场景下,如果不考虑并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题,MyISAM也是一个不错的选择;比如,对于从库,是不需要考虑并发等特性,可以直接用MyISAM;但《MySQL高性能》上面有一句话这样写到:

不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。

三、锁机制与InnoDB锁算法

1. MyISAM和InnoDB存储引擎使用的锁:

  • MyISAM 采用表级锁(table-level locking)。
  • InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁

2. 按照锁的粒度把数据库锁分为表级锁和行级锁

  • 表级锁

对当前操作的整张表加锁;实现简单,资源消耗较少,加锁快,不会出现死锁 。但锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。

  • 行级锁

只针对当前操作的行进行加锁;行级锁加锁粒度最小,并发度高,能大大减少数据库写操作的冲突,但加锁的开销也最大,加锁慢,会出现死锁。 InnoDB支持的行级锁,包括如下几种。

  • Record Lock: 对索引项加锁,锁定符合条件的行。其他事务不能修改和删除加锁项;
  • Gap Lock: 对索引项之间的“间隙”加锁,锁定记录的范围(对第一条记录前的间隙或最后一条将记录后的间隙加锁),不包含索引项本身。其他事务不能在锁范围内插入数据,这样就防止了别的事务新增幻影行。
  • Next-key Lock: 锁定索引项本身和索引范围。即Record Lock和Gap Lock的结合。可解决幻读问题。

页级锁

MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。页级进行了折衷,一次锁定相邻的一组记录。BDB支持页级锁。开销和加锁时间界于表锁和行锁之间,会出现死锁。锁定粒度界于表锁和行锁之间,并发度一般。

3. 表级锁和行级锁可以进一步划分为共享锁(s)和排它锁(X)

  • 共享锁(Share Locks)

共享锁又被称为读锁,可以并发读取数据,但任何事务都不能获取数据上的排他锁,直到已释放所有共享锁。使用中若事务T对记录A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

  • 排他锁(Exclusive lock):

排它锁又称为写锁,若事务T对记录A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。

  • 两者之间的区别:

共享锁:如果事务T对数据A加上共享锁后,其他事务只能对A再加共享锁,不能加排他锁。获取共享锁的事务只能读数据,不能修改数据。

排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获取排他锁的事务既能读数据,又能修改数据。
4. InnoDB另外的两个表级锁,IS和IX意向锁

  • 意向共享锁(IS)

表示事务准备给数据行记入共享锁,事务在一个数据行加共享锁前必须先取得该表的IS锁。

  • 意向排他锁(IX)

​​​​​​​ 表示事务准备给数据行加入排他锁,事务在一个数据行加排他锁前必须先取得该表的IX锁。

意向锁是表级锁,表示的是一种意向,仅仅表示事务正在读或写某一行记录,在真正加行锁时才会判断是否冲突。意向锁是InnoDB自动加的,不需要用户干预。

IX,IS是表级锁,不会和行级的X,S锁发生冲突,只会和表级的X,S发生冲突。

意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

你可能感兴趣的:(Mysql,存储引擎,行级锁和表级锁,意向锁,MyISAM和InnoDb区别,MySQL进阶)