MySQL 中 MyISAM 与 InnoDB 引擎的区别

分析&回答

区别很多,大家说出下面几点,面试就应该 OK 了

1) 事务支持

MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。

2) 外键

外键 ( foreign key ) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

  • MyISAM:不支持
  • InnoDB:支持

3) 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

MyISAM锁的粒度是表级,而InnoDB支持行级锁定。简单来说就是, InnoDB支持数据行锁定,而MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

4) 全文索引

  • MyISAM:支持(FULLTEXT类型的)全文索引\
  • InnoDB:之前不支持(FULLTEXT类型的)全文索引,5.6版本之后InnoDB存储引擎开始支持全文索引。5.7版本之后通过使用ngram插件开始支持中文。

全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

另外,MyIsam索引和数据分离,InnoDB在一起,MyIsam天生非聚簇索引,最多有一个unique的性质,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为"聚簇索引"

5) CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。MyISAM内置了一个计数器保存有表的总行数。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

反思&扩展

MyISAM和InnoDB两者的应用场景

  1. MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  2. InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持、存储 过程、视图、行级锁定等等。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

MySQL支持三种模式的全文检索模式

  1. 自然语言模式:通过MATCH AGAINST 传递某个特定的字符串进行检索
  2. 布尔模式:可以为检索的字符串增加操作符,"+"表示必须包含、"-"表示必须排除、">"表示出现该单词时增加相关性、"<"表示出现该单词时降低相关性、"*"表示通配符、"~"允许出现该单词等
  3. 查询扩展模式

InnoDB全文索引是如何实现的?

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

相关推荐
_Power_Y5 分钟前
Java面试常用算法api速刷
java·算法·面试
纪莫7 分钟前
技术面:Spring (事务传播机制、事务失效的原因、BeanFactory和FactoryBean的关系)
java·spring·java面试⑧股
RestCloud19 分钟前
在制造业数字化转型浪潮中,数据已成为核心生产要素。然而,系统割裂、数据滞后、开发运维成本高等问题,却像顽固的 “数据枷锁”,阻碍着企业发展。ETLCloud与
数据库·postgresql
红衣小蛇妖28 分钟前
LeetCode-704-二分查找
java·算法·leetcode·职场和发展
!chen30 分钟前
【Spring Boot】自定义starter
java·数据库·spring boot
流烟默42 分钟前
MySQL索引调优之索引顺序必须和字段顺序一致吗?
mysql·索引调优
koko4243 分钟前
天津小公司面经
java·学习·面试
zjjuejin1 小时前
Maven 现代开发流程的集成
java·后端·maven
Zzzzmo_1 小时前
【Java】杨辉三角、洗牌算法
java·数据结构·算法
码界奇点1 小时前
基于飞算JavaAI的在线图书借阅平台从设计到实现的完整指南
java·飞书