写点什么

还在傻乎乎得背 MyISAM 与 InnoDB 的区别?一篇文章让你理解的明明白白

  • 2021 年 11 月 12 日
  • 本文字数:1128 字

    阅读完需:约 4 分钟

InnoDB 存储引擎的特点是:行级锁、事务安全(ACID 兼容)、支持外键、不支持 FULLTEXT 类型的索引(5.6.4 以后版本开始支持 FULLTEXT 类型的索引)。InnoDB 存储引擎提供了具有提交、回滚和


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


崩溃恢复能力的事务安全存储引擎。InnoDB 是为处理巨大量时拥有最大性能而设计的。它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。以下是 MySQL 5.7 InnoDB 存储引擎的版本特性。



??MyISAM 与 InnoDB 性能测试




MyISAM 与 InnoDB 谁的性能更高,其实官方已经给了压测图




其实瞎眼可见的结果是:MyISAM 被 InnoDB 直接按在地上摩擦!


??是否支持事务




MyISAM 是一种非事务性的引擎(不支持事务),使得 MyISAM 引擎的 MySQL 可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。


InnoDB 是事务安全的(支持事务),事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM 就不可以了。


??MyISAM 与 InnoDB 表锁和行锁




MySQL 表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对 MyISAM 表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对 MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作。


InnoDB 行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB 才使用行级锁,否则将使用表锁!行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。在 InnoDB 两个事务发生死锁的时候,会计算出每个事务影响的行数,然后回滚行数少的那个事务。当锁定的场景中不涉及 Innodb 的时候,InnoDB 是检测不到的。只能依靠锁定超时来解决。


??是否保存数据库表中表的具体行数




InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table?时,InnoDB 要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。


??如何选择




虽然 InnoDB 很好,但是也不是无脑选,有些情况下 MyISAM 比 InnoDB 更好!


MyISAM 适合:


  1. 做很多 count 的计算;

  2. 插入不频繁,查询非常频繁,如果执行大量的 SELECT,MyISAM 是更好的选择;

  3. 没有事务。


InnoDB 适合:


  1. 可靠性要求比较高,或者要求事务;

  2. 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;

  3. 如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,应该使用 InnoDB 表;

  4. DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的 删除;

  5. LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。

评论

发布
暂无评论
还在傻乎乎得背MyISAM与InnoDB 的区别?一篇文章让你理解的明明白白