MySQL的MyISAM和InnoDB存储引擎的区别

锁机制不同

  • MyISAM存储引擎只支持表级锁
    • 模式: 表共享读锁和表独享写锁
      1. MyISAM存储引擎在进行读某一张表时, 不会阻塞其他连接对该表的读操作, 只会阻塞其他连接对该标的写操作.
      2. MyISAM存储引擎的锁机制是自动加上的, 即当执行select语句时,会对整张表加上读锁; 当执行insert, update, delete语句时, 会对整张表加上写锁.
      3. MyISAM存储引擎在默认情况下, 同一时刻,A连接需要进行读操作 B连接需要进行写操作, 则MyISAM存储引擎优先让B连接获取写锁然后再让A连接获取读锁.
  • InnoDB存储引擎支持行级锁和表级锁
    • 模式: 共享锁和排它锁
      • 共享锁: 允许一个事务去读取一行数据, 阻止其他事务获取相同数据集的排它锁(即当一个事务在读取一行数据时, 阻止其他事物对该数据进行写操作).
      • 排它锁: 允许拥有排它锁的事务去更新一行数据, 阻止其他事务获取相同数据集的共享读锁和排他写锁(即当一个拥有排他写锁的事务去更新一行数据时, 其他事务不能来读/写这一行数据).
    • 为了实现行级锁和表级锁共存, 实现细粒度的锁机制. InnoDB存储引擎内部实现了意向锁(表级锁)
      • 意向共享锁: 当一个事务想要个数据行加上行共享锁时, 必须先获取该表的意向共享锁.
      • 意向排它锁: 当一个事务想要给数据行加上行排它锁时, 必须先获取该表的意向排它锁.
    • InnoDB存储引擎内部实现的意向锁是自动加上的无需执行SQL语句
    • InnoDB存储引擎的行级锁是通过个索引上的索引项加锁来实现的,如果没有索引, InnoDB存储引擎会通过隐藏的聚簇索引来对记录加锁;(即如果不创建索引, 不通过所索引来检索数据, 则InnoDB存储引擎会给整张表加上锁, 即相当于表级锁)
    • 备注:
      1. 表级锁: 开销小, 加锁快, 不会出现死锁的情况, 但是颗粒度大(整张表),并发度低,容易发生锁的竞争.
      2. 行级锁: 开销大, 加锁慢, 会出现死锁的情况, 但是颗粒度小(一行数据), 并发度高.
      3. 页面锁: 开销大, 加锁速度, 颗粒度, 并发度都介于行级锁和表级锁之间.

是否支持事务

  • MyISAM存储引擎不支持事务, MyISAM存储引擎强调的是高性能的查询. 即MyISAM存储引擎适用于读操作多,写操作少的应用场景.
  • InnoDB存储引擎支持事务,并且支持四种事务.
    • 事务的隔离级别: (读未提交, 读已提交, 可重复读, 可序列化)
      1. 读未提交: 是最低的事务隔离级别, 允许读取未提交的事务变更. 导致: 脏读, 不可重复读, 幻读.
      2. 读已提交: 是MySQL默认的事务隔离级别, 允许读取已提交事务的结果. 导致: 不可重复读, 幻读.
      3. 可重复读: 对同一字段多次读取结果是一样的, 但是由于InnoDB存储引擎中的Gap Lock算法的存在使得InnoDB存储引擎不会导致幻读的问题; 但对于Oracle/SQL Server会出现幻读.
      4. 可序列化: 是最高的事务隔离级别, 要求同一时刻最多有一个事务在执行操作. 导致: 影响数据库性能 .
    • 事务的隔离级别越高, 更容易导致数据库出现锁冲突 /死锁.

索引

  • 索引的支持情况:
    • MySQL数据库提供了四种索引实现方式:
      1. B-Tree索引(树索引): 最常见的索引类型, 通过B树来实现对数据的快速访问.
      2. R-Tree索引: 通过空间索引来实现对于数据的快速访问.
      3. Full-Text索引: 全文检索, 用于快速检索较大的文本.
      4. HASH索引: 通过构造hash表来实现对数据的快速访问(只用Memory存储引擎支持).
    • MyISAM存储引擎支持的索引类型:
      1. B-Tree索引
      2. R-Tree索引
      3. Full-Text索引
    • InnoDB存储引擎支持的索引类型:
      1. B-Tree索引
      2. R-Tree索引(5.7.4版本后)
      3. Full-Text索引(5.6版本后)
  • 主键
    • MyISAM存储引擎支持没有主键的表存在.
    • InnoDB存储引擎的每张表必须有主键.
  • 自增列(自增主键):
    • InnoDB存储引擎的自增列, InnoDB规定必须包含只有该字段的索引.
    • MyISAM存储器的自增列, 可以将该字段与其他字段组成联合索引.

存储结构不同

  • MyISAM存储引擎将一张表的结构和内容拆分为三个文件:
    • 表结构文件: 后缀名为 .frm
    • 索引文件: 后缀名为 MYI
    • 数据文件: 后缀名为 MYD
    • 索引文件存记录所在数据文件的位置, 通过读取索引文件获取位置信息后, 通过读取数据文件快速获取数据
  • InnoDB存储引擎将一张表的结构和内容拆分为两个文件:
    • 表结构文件: 后缀名为 .frm
    • 数据/索引文件: 后缀名为 .idb
    • InnoDB采用了聚簇索引的方式实现B-Tree索引,聚簇索引的实现方式是将数据行和相邻主键紧凑地存入文件中。
    • 对于主键索引,即存储索引值(主键的值),也存储每列的数据。如果没有设置主键,那么会尝试将外键作为主键。如果也没有外键,那么会自动生成一个隐藏的ROWID做主键。

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值