❤序言
相信不少的小伙伴在准备面试题的时候,必定会遇到这个面试题,MyISAM与InnoDB 的区别是什么?我们当时可谓是背一次忘一次,以至于很多的同学去找实习工作的时候,经常被这个问题卡脖子,那么今天我就系统的来说一说MyISAM与InnoDB 的区别,一问让你们彻底整明白!
🧡MySQL默认存储引擎的变迁
熟悉MySQL的小伙伴们都知道,在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。这也间接说明了,MySQL官方更推荐使用InnoDB。
💛MyISAM与InnoDB存储引擎的主要特点
💚MyISAM
MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心。下图是MySQL 5.7 MyISAM存储引擎的版本特性。
💙InnoDB
InnoDB存储引擎的特点是:行级锁、事务安全(ACID兼容)、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。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适合:
- 做很多count 的计算;
- 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择;
- 没有事务。
InnoDB适合:
- 可靠性要求比较高,或者要求事务;
- 表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
- 如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表;
- DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除;
- LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。