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全文索引是如何实现的?

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

相关推荐
Ljw...13 分钟前
图形化界面MySQL(MySQL)(超级详细)
数据库·mysql·图形化界面mysql
多来米199615 分钟前
小白学多线程(持续更新中)
java·开发语言
ZERO空白16 分钟前
Spring MVC:原理、配置与基础应用详解
java·spring·mvc
@小小小吴1 小时前
mysql安装---rpm包
数据库·mysql
冰零(lane)1 小时前
手写一个深拷贝工具
java
paterWang1 小时前
小程序-基于java+SpringBoot+Vue的流浪动物救助小程序设计与实现
java·spring boot·小程序
程序leo源2 小时前
C语言:操作符详解1
android·java·c语言·c++·青少年编程·c#
轮到我狗叫了3 小时前
栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历
java·算法·leetcode
王ASC3 小时前
JDBC使用p6spy记录实际执行SQL方法【解决SQL打印两次问题】
数据库·sql
冰之杍4 小时前
Vscode进行Java开发环境搭建
java·ide·vscode