索引的数据结构

为什么不是二叉树,红黑树什么的呢?

首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上。然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作。

而二叉树啊这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少。

为什么是B+树而不是B树呢?

1. 单一节点存储更多的元素(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。

B+树真正的数据都存在叶子结点嘛,也就是上面的结点就简单的索引,就内存会更小,意味着同样的一个页内存大小,所以B+树中,同样的磁盘页大小可以装更多个“索引”,也就是在同样的数据量的情况下,B+树会比B树更加矮胖,因此查询时IO的次数也更加少。

2. 所有查询都要查找到叶子节点,查询性能稳定。

B+树的查询必须查到叶子结点,因为它真正的数据都在叶子嘛,而B树不是,B树只要匹配到那个索引data就好,无论它是在中间结点还是叶子结点,因此B树的查询不是稳定的,最好的情况是只找根节点就行,最坏的情况是找到叶子结点,而B+树的每次查找都是稳定的。

3. 所有叶子节点形成有序链表,便于范围查询。

B树的范围查询十分麻烦,B+树的范围查询只需要在最下面的叶子结点的链表中做遍历就行。

关于MySQL存储引擎的简单介绍(全都复制粘贴的)

存储引擎?

定义:

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。

存储引擎作用:

1)设计并创建数据库以保存系统所需的关系或XML文档。

2)实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。

3)为单位或客户部署实现的系统。

4)提供日常管理支持以优化数据库的性能。

Innodb和MyIASM

1.简单介绍这两种引擎,以及该如何去选择。
2.这两种引擎所使用的数据结构是什么。

1.怎么选择

a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用会提升效率的。

b.MyIASM引擎,它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的。可以将MyIASM作为数据库引擎的首先。

  补充2点:

  c.大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

  d.大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

2.两种引擎所使用的索引的数据结构是什么?

答案:都是B+树!

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

Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

下面的内容再详细地介绍下这两种引擎中的索引机制

聚簇索引和非聚簇索引

先是InnoDB下的索引机制。

1. Innodb中的聚簇索引

在InnoDb中,用的就是聚簇索引,而且会默认为主键设置聚簇索引 ,Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

所谓聚簇索引,就是索引的逻辑顺序和数据的物理顺序是一致的,就像字典,你想找“怕”字,你会直接翻到字母“p”的位置开始找。innodb中的主键索引也就是主索引就是这样的机制,它的数据就在主索引的B+树的叶子节点 上:

聚簇索引的优点:

  1. 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
  2. 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的

聚簇索引的缺点:

  1. 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
  2. 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE命令重新组织一下表。
  3. 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
  4. 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。

2. Innodb中的辅助索引

这里的辅助索引指的是不是建立在主键,或者说是聚簇索引的所在列的索引。这些索引的B+树中的叶子节点存的是该属性所对应的row的主键值。然后再通过这个主键值去主键索引的B+树中去找那个row。所以有时候也叫二次索引,就是建立在主聚簇索引上的索引,要二次搜索。

MyISAM下的索引机制

而在MyISAM中,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址!!

所以在MyISAM中,主索引和所谓是辅助索引,是一样的。

1. 主键索引:

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM主键索引的原理图:

这里设表一共有三列,假设我们以Col1为主键,图myisam1是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。

2. 辅助索引(Secondary key):

在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

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

用一张图总结下这两个引擎中的索引机制:

参考文章:

https://blog.csdn.net/qq_35571554/article/details/82759668——《漫画叙述B+树和B-树,很值得看!》分析为什么是B+而不是B树,生动形象

https://www.cnblogs.com/sunsky303/p/8274586.html——《mysql各种引擎对比、实战 》这篇文章介绍了存储引擎的概念

https://www.cnblogs.com/xiaohaillong/p/6079551.html——《mysql的常用引擎 》,分析Innodb和MyIASM两个引擎

https://blog.csdn.net/lm1060891265/article/details/81482136——《聚簇索引和非聚簇索引》内容是蛮齐全的,就是写得很乱……

转载于:https://www.cnblogs.com/wangshen31/p/10519557.html

为什么用B+树做索引MySQL存储引擎简介相关推荐

  1. 第 3 章 MySQL 存储引擎简介

    3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所提到的 ISAM,是ISAM的升 ...

  2. mysql存储引擎简介

    什么是存储引擎 mysql存储引擎是数据库如何存储数据.怎样建立索引以及如何查询更新数据等技术的实现方法,数据通过使用不同的技术存储在文件中,使用不同的存储机制.索引方式来提供不同的功能.在mysql ...

  3. MySQL性能调优与架构设计(二)—— MySQL存储引擎简介

    什么是存储引擎 mysql中的数据用各种不同的技术存储在文件(或者内存)中. 这些技术中每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力. 通过选择不同的技术,你能 ...

  4. MySQL存储引擎简介——《高性能MySQL》

    在文件系统中,Mysql将每个数据库(也可以称之为schmea)保存为数据目下的一个子目录.数据库和表的定义都使用文件系统的目录和文件来保存,大小写敏感和具体的平台密切相关.在Windows中,大小写 ...

  5. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

  6. MySQL Innodb存储引擎使用B+树做索引的优点

    对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...

  7. MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树

    B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...

  8. mysql为什么不用b树_MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. 1.B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结 ...

  9. 二叉树、B树(B-树)、B+树、B*树详解,以及为什么MySQL选择B+树做索引

    温故而知新,可以为师矣.看到一篇介绍B数和B减树的文章,这里记录一下. 1. 简要 众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. 2. 二叉树 ...

最新文章

  1. pandas dataframe 过滤——apply最灵活!!!
  2. Linux 线程(1):线程概述
  3. 高中生兴趣班c语言,C语言电脑编程兴趣班测试题目资料.doc
  4. java中介者模式例子_Java中介者模式(Mediator Pattern)
  5. UVA10603Fill题解--BFS
  6. ubuntu16.04 内核源码编译
  7. java中的垃圾收集器_Java中的垃圾收集
  8. Matlab与C/C++混合编程 Matlab调用C函数
  9. C++虚复制构造函数,设置Clone()方法返回基类指针,并设置为虚函数
  10. 一款自动生成唯一头像的开源代码库
  11. 16种常用统计分析软件介绍
  12. 咸鱼Maya笔记—Maya 多边形建模
  13. 百度K站的神奇简单有效的方法
  14. EL表达式的语法、用法及说明
  15. 计算机社团活动照片,电脑绘画兴趣小组活动记录表Word版
  16. [Git[ 解决 git branch -M main error: refname refs/heads/master not found
  17. SAS系统学习之初探
  18. 高精度地图,从入门到入行
  19. Java中的Hash Code到底是什么?
  20. Word 中插入高亮代码 | planetB | syntax-highlight-word

热门文章

  1. easyUI的combobox是否可用
  2. javascript编译与运行的几个实验
  3. MYSQL中 ENUM 类型
  4. shell 语法格式
  5. CentOS6.0搭建DNS
  6. Fvwm-背景图片设置三法
  7. QT中关于ipv6和getaddressinfo的开关
  8. 2017前端框架何去何从
  9. 网络安全人才纳人"城市合伙人"计划 1亿资金招募顶尖人才
  10. Spring+SpringMVC+MyBatis深入学习及搭建(十四)——SpringMVC和MyBatis整合