热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

中单引号和双引号的区别与联系_面试|MySQL中InnoDB和MyISAM的联系与区别

很多同学在面试中会被问到数据库的问题,而常被问到的一个问题就是:MySQL中的InnoDB和MyISAM之间是什么关系,分别有什么特点&#
b581bb59464e6e9aff01606832b0a1ee.png

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

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

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

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

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

f384c6b4e845247e99d65a44be83f213.png

数据库存储引擎

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

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

SHOW ENGINES;

cb4821039d72ec916c54a39dfded16c4.png

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

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

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

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

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

d95353bebcff1e772802c2d4f1f98c84.png

存储引擎原理

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

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

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

B 树和 B+ 树

那么什么是 B+ 树?

a494563157ae4f866f0abb6b5794793e.png

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

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

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

而对于 B&#43; 树&#xff1a;

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

一个 B&#43; 树的 C&#43;&#43; 定义类似如下&#xff1a;

204bc27afb4d9741682719a2477a6651.png
363b36ac1cbf8f48059ff3065ae0aabb.png

什么是索引

由于以上实现的数据结构与数据库中索引相关&#xff0c;关于索引&#xff0c;有以下知识&#xff1a;

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

MyISAM

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

3fae21ee895acb36215db33d2e9a8388.png

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

InnoDB

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

7f4b7570f94dc6e21cf991806783bf5e.png

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

小结

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

本文作者&#xff1a;Nova Kwok

声明&#xff1a;本文归 “力扣” 版权所有&#xff0c;如需转载请联系。

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



推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
小新爱神起的小媳妇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有