您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL 中 InnoDB 和 MyISAM 的联系与区别

时间:2020-12-08 12:21:31  来源:  作者:
面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

很多同学在面试中会被问到数据库的问题,而常被问到的一个问题就是:

MySQL 中的 InnoDB 和 MyISAM 之间是什么关系分别有什么特点

许多同学都把 MySQL 作为自己的数据库,但是可能用过最多的就是 SQL 语句,以及一些 ORM 的写法,而对底层的实现了解甚少,比如上述问题中,InnoDB 和 MyISAM 分别是什么,可能都不是非常清楚。然而在一些大型公司(比如腾讯)的面试题中,可能会高频率地出现这类的问题,所以对于这类问题的正确理解,就显得非常重要了。

其实 InnoDB 和 MyISAM 是 MySQL 的两个「存储引擎」。

下面我将详细阐述一下这两者之间的联系和区别。

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

数据库存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

如何知道自己的数据库用的什么引擎呢?

SHOW ENGINES;

 

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

我们可以看出数据库为我们提供了非常多的存储引擎,从表中看出,InnoDB 的 Support 列是 DEFAULT,表明在我的数据库服务器上,InnoDB 是默认的数据库引擎,不过 MySQL 对于多引擎有很好的兼容,一个数据库服务器上不同的数据库完全可以使用不同的数据引擎,甚至一个数据库中的多个表也可以使用不同的引擎。

从一些文档中我们可以总结出这两个引擎的一些差异:

  • InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语句都默认封装成事务进行提交,这样就会影响速度,优化速度的方式是将多条 SQL 语句放在 begin 和 commit 之间,组成一个事务;
  • InnoDB 支持外键,而 MyISAM 不支持。

所以如果一个表修改要求比较高的事务处理,可以选择 InnoDB。这个数据库中可以将查询要求比较高的表选择 MyISAM 存储。如果该数据库需要一个用于查询的临时表,甚至可以考虑选择 MEMORY 存储引擎。

但是为什么 InnoDB 和 MyISAM 之间会有这些差异呢?我们需要了解一下对应的储存引擎的底层原理。

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

存储引擎原理

首先针对可能面试会问到的问题「MyISAM 和 InnoDB 两种引擎所使用的索引的数据结构是什么」做一个回答:

都是 B+ 树,不过区别在于:

  • MyISAM 中 B+ 树的数据结构存储的内容是实际数据的地址值,它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
  • InnoDB 中 B+ 树的数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

 

B 树和 B+ 树

那么什么是 B+ 树?

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

B+ 树是 B 树的一个变种,对于 B 树来说:

B 树属于多叉树又名平衡多路查找树,其规则是:

  • 所有节点关键字是按递增次序排列,并遵循左小右大原则
  • 子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M 路,当 M=2 则是 2 叉树,M=3 则是 3 叉)
  • 关键字数:枝节点的关键字数量大于等于 ceil(m/2)-1 个且小于等于 M-1 个(注:ceil() 是个朝正无穷方向取整的函数 如 ceil(1.1)结果为 2)
  • 叶节点的指针为空且叶节点具有相同的深度

而对于 B+ 树:

B+ 树是 B 树的一个升级版,相对于 B 树来说 B+ 树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。

一个 B+ 树的 C++ 定义类似如下:

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 


面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

什么是索引

由于以上实现的数据结构与数据库中索引相关,关于索引,有以下知识:

  • 唯一索引:唯一索引不允许两行具有相同的索引值
  • 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
  • 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
  • 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于 249 个

 

MyISAM

回到 MyISAM,其索引结构如下图所示,由于 MyISAM 的索引文件仅仅保存数据记录的地址。在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别:

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址,读取相应数据记录。

InnoDB

对于 InnoDB 来说,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶节点 data 域保存了完整的数据记录。

面试 | MySQL 中 InnoDB 和 MyISAM 的联系与区别

 

由于 InnoDB 利用的数据库主键作为索引 Key,所以 InnoDB 数据表文件本身就是主索引,且因为 InnoDB 数据文件需要按照主键聚集,所以使用 InnoDB 作为数据引擎的表需要有个主键,如果没有显式指定的话 MySQL 会尝试自动选择一个可以唯一标识数据的列作为主键,如果无法找到,则会生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

小结

对于面试题来说,一般只会被要求回答到 InnoDB 和 MyISAM 在使用上的区别,不过如果需要深究一下为什么会有那些区别的话,就需要了解其底层的实现原理,顺便还需要对于 B+ 树有一定的了解,相信读者在读完本文后已经可以比较清晰地了解其背后的原理概要了,离拿到希望的 Offer 又近了一步。

本文作者:Nova Kwok

声明:本文归 “力扣” 版权所有,如需转载请联系。

文中部分图片来源于网络,为非商业用途使用,如有侵权联系删除。



Tags:MySQL   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
很多同学在面试中会被问到数据库的问题,而常被问到的一个问题就是:MySQL 中的 InnoDB 和 MyISAM 之间是什么关系,分别有什么特点?许多同学都把 MySQL 作为自己的数据库,但是可能...【详细内容】
2020-12-08   MySQL  点击:(3)  评论:(0)  加入收藏
前言为了避免删库跑路的事情,权限管理和数据备份是必要。机器环境 mysql 8.0.21 x86_64 MySQL Community Serve centos 7Mysql 权限管理Mysql 8.0 可以创建角色,然后将操作...【详细内容】
2020-11-23   MySQL  点击:(4)  评论:(0)  加入收藏
MySQL 8 之前,使用的动态变量不是永久性的,并且在重启后会重置。可在运行时使用 SET 语句更改这些变量,以影响当前实例的操作,但是我们必须手动更新 my.cnf 配置文件以使其持久化。...【详细内容】
2020-11-19   MySQL  点击:(6)  评论:(0)  加入收藏
总结下之前看到的一些关于MySQL索引原理的内容,好记性不如烂笔头。1. B+树我们知道InnoDB的索引是以B+树的形式组织的。B+树是一种树数据结构,是一个n叉树,每个节点通常有多个...【详细内容】
2020-11-10   MySQL  点击:(4)  评论:(0)  加入收藏
作者:姚远专注于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6,5.7,8.0 OCP。现在鼎甲科技任技术顾问,为同事和客户提供数据库培训和技术支持服务。本文来源:原创投...【详细内容】
2020-11-09   MySQL  点击:(11)  评论:(0)  加入收藏
单条SQL语句执行时,会被当成一个事务提交吗?以下内容摘自 《高性能MySQL》(第3版)“MySQL默认采用自动提交(AUTOCOMMIT)模式。也就是说,如果不是显式地开始一个事务,则每个查询都...【详细内容】
2020-11-04   MySQL  点击:(8)  评论:(0)  加入收藏
每一个好习惯都是一笔财富,本文分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~公众号:捡田螺的小男孩1. 写完SQL先explain查看执行计划(SQL...【详细内容】
2020-11-03   MySQL  点击:(4)  评论:(0)  加入收藏
Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES) 这个错误在网上搜一下,能看到非常多的此类问题的解决方法,但 MySQL 版本不一样,导致同一...【详细内容】
2020-10-20   MySQL  点击:(14)  评论:(0)  加入收藏
我们的合作客户,驻场人员报告说一个 RDS 实例出现磁盘不足的告警,需要排查。...【详细内容】
2020-10-20   MySQL  点击:(15)  评论:(0)  加入收藏
MySQL 数据库服务器的 CPU 和主板都换了,重新开机,发现 MySQL 无法启动!!!...【详细内容】
2020-10-16   MySQL  点击:(9)  评论:(0)  加入收藏
近期投产生产 MySQL组复制集群偶尔出现节点被逐出集群的情况,怀疑是网络抖动导致。查询官方文档发现,MySQL 8.0.13 版本引入集群网络延迟容错参数group_replication_member_expel_timeout。...【详细内容】
2020-10-14   MySQL  点击:(6)  评论:(0)  加入收藏
1. UUID 是什么?UUID(Universally Unique Identifier 通用唯一识别码)用于标识资源唯一性。理论上说,门牌号、电话号码、邮编、身份证号都是用来标识资源唯一性的,但为使用方便,...【详细内容】
2020-10-09   MySQL  点击:(11)  评论:(0)  加入收藏
一、Atlas介绍Atlas是360开源的一个Mysql Proxy,以下是官方介绍:Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官...【详细内容】
2020-09-29   MySQL  点击:(22)  评论:(0)  加入收藏
内网数据库访问,在没有公网 IP 的情况下如何实现在外网访问内网数据库。这个时候我们可以利用内网穿透来实现,内网映射到外网,可实现在没有公网 ip 的情况下,直接在外网访问内网...【详细内容】
2020-08-27   MySQL  点击:(13)  评论:(0)  加入收藏
有人说目前为止8.0是最好的版本,我们来看看在运维方面MySQL 8.0带来了哪些便捷命令。自MySQL 8.0 GA版本发布以来,MySQL生态发生了很大的变化,推出了很多功能 ,有人说目前为止8....【详细内容】
2020-08-20   MySQL  点击:(9)  评论:(0)  加入收藏
我曾经在文章《MySQL 5.7 安装后的性能调优》(文末链接)和《MySQL 101:调整 MySQL 性能的参数》(文末链接)中谈到过 innodb_buffer_pool_instances 这个参数 ,建议使用值为“8”,但我不能说这个值是否足够好。因此,让我们看看...【详细内容】
2020-08-19   MySQL  点击:(7)  评论:(0)  加入收藏
ProxySQL是用C++语言开发的,一个轻量级开源软件,性能和功能满足读写中间件所需的绝大多数功能,其配置数据基于SQLite存储,目前已到v2.0.13版本。功能方面如下: 最基本的读/写分...【详细内容】
2020-08-17   MySQL  点击:(6)  评论:(0)  加入收藏
INSERT语句是最常见的SQL语句之一,MySQL中INSERT有其他形态的插入数据方式。下面了解一下mysql中常用的四种插入数据的语句:INSERT INTO1.insert into表示插入数据,数据库会检...【详细内容】
2020-08-13   MySQL  点击:(11)  评论:(0)  加入收藏
在上一篇文章《用Explain 命令分析 MySQL 的 SQL 执行》中,我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行计划未被选...【详细内容】
2020-08-03   MySQL  点击:(7)  评论:(0)  加入收藏
背景zabbix 数据库由阿里云 RDS 迁移至自建 DB,迁移过程中发现 RDS 存储引擎为 tokudb ,手把手撸一遍前置要求 Prerequisites 安装 libjemalloc libraryyum install jemalloc...【详细内容】
2020-07-30   MySQL  点击:(8)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条