MySQL中的InnoDB和MyISAM的区别与联系

1.前言

前面虽然学习了MySQL,我们最常用的操作可能就是增删该查,但是对于底层的原理知道的不多,当看了一篇文章解释了InnDB和MyISAM的区别与联系之后,才真正了解到它们之间的联系与区别。因此有必要深入的了解一下数据库的底层。

2.概述

InnoDB和MyISAM都是MySQL 的两个存储引擎,那么在知道它们是干什么之前,我们得知道数据库存储引擎是干什么的?
  数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等,使用不同的存储引擎,还可以获得特定的功能。
相信我们很多人的电脑上已经安装了数据库,那么我们可以使用 SHOW ENGINES 来查看我们数据库的引擎是什么?
在这里插入图片描述
从上面的图片中可以看出我们的数据库的里面提供了很多的存储引擎,我们可以发现我们的数据库默认的存储引擎是InnoDB,但是MySQL对于多存储引擎有着很好的兼容,一个数据库服务器上不同的数据库完全可以使用不同的数据引擎,甚至一个数据库中的多个表也可以使用不同的引擎。

3.联系与区别

  • InnoDB 支持事务,MyISAM不支持,对于InnoDB 每一条 SQL 语句都会默认封装成事务进行提交,这样就会影响执行速度,优化的方法就是将多条语句放在 begin和commit之间,组成一个事务。
  • InnoDB 支持外键,但是MyISAM 不支持
  • InnoDB 不支持全文索引,但是MyISAM 支持全文索引,查询效率上MyISAM 的会更加快一点。

综上 我们可以得出结论
如果一个表修改要求比较高的事务处理,可以选择InnoDB。对于查询要求比较高的表可以选择MyISAM存储。那么这两个存储引擎为什么会出现较大的差别呢?那么就要研究其底层实现原理。

4.存储引擎底层原理

1.索引
  • 唯一索引: 唯一索引不允许两行具有相同的索引值
  • 主键索引: 为表定义一个主键索引将会自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值都是唯一的,并且不能为空。
  • 聚集索引:表中各行的物理顺序与键值的索引顺序相同,每个表中只能有一个
  • 非聚集索引:非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含执行数据存储位置的指针可以有多个,小于249个。
2. InnoDB 和 MyISAM 两种引擎使用的索引的数据结构都是B+树,区别为:
  • InnoDB 中的B+ 树的结构中存储的都是实际的数据,这种索引被称为聚集索引
  • MyISAM 中的 B+ 树的数据结构存储的内容是实际数据的地址值,他的索引和实际数据是分开的,只不过使用了索引指向了实际数据,这种索引的模式被称为非聚集索引
3. 什么是B树和B+树

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

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

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

  • 拥有 K 个孩子的非叶子节点包含 k 个keys(关键字),且递增排列。每个关键字不保存数据,只用来索引。
  • 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  • 所有的非叶子结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小)关键字
  • 非叶子结点的子树指针P[i],指向关键字值属于[ K[i], K[i+1] )的子树
    MyISAM
    MyISAM的索引文件仅仅只是保存数据记录的地址。MyISAM 中索引检索的算法首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data的值,然后根据data域的值为地址读取相应的数据记录。
    在这里插入图片描述
    InnoDB
    对于InnoDB,表数据文件本身就是按照B+Tree组织一个索引结构,这棵树的叶子节点data域保存了完整的数据记录。
    由于 InnoDB 利用的数据库主键作为索引 Key,所以 InnoDB 数据表文件本身就是主索引,且因为 InnoDB 数据文件需要按照主键聚集,所以使用 InnoDB 作为数据引擎的表需要有个主键,如果没有显式指定的话 MySQL 会尝试自动选择一个可以唯一标识数据的列作为主键,如果无法找到,则会生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

在这里插入图片描述
本篇博客参考了力扣微信公众号的文章。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值