金三银四阿里必问,索引底层详剖(二叉树、AVL、B-Tree等)

154 阅读3分钟

今天在学习B站上的mysql课程,推荐大家也可以看一下金三银四阿里必问,索引底层详剖(二叉树、AVL、B-Tree等)

数据库索引:

这些问题你知道吗?

image.png

什么是索引

索引的本质是什么? 比如目录 无效的目录-纸张-浪费资源

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。

  • 索引(index)是帮助Mysql高效获取数据的数据结构

  • 在Mysql中,数据最终存储在磁盘中

为什么mysql不用二叉搜索树

数据结构

image.png 一个节点最多分2个子节点,节点的呈现方式:左小右大,例如:0004比0006小。

image.png 运用二叉搜索树后,查询结果由9次减少为4次。相比之前不用数据结构,查询效率提供。

image.png

单边树存在的问题:

建立索引还有意义吗?建议索引还有用吗? image.png

AVL 平衡二叉树

AVL 平衡二叉树是在二叉树的基础上做了进一步优化,相对平衡,要求左子树与右子树高度之差,不能大于1. 左旋、右旋。

image.png

查找多少次,是目标数据在树的层的高度决定的。高度越高,层次越多,查找次数越多。AVL是相对平衡,但是本质还是二叉树,一个节点只能分裂2个子节点,比如数据只有5条,最多查找3次,高度只有3层,还不错。如果数据有500万条呢,那么数据结构,二叉树不断向下纵向发展。数据的高度层次越来越多,最终查找次数也越来越多。

mysql磁盘中的数据如何读取?

计算机的三大件:cpu、内存、磁盘

image.png

内存的数据重启后会丢失。

查一次放到内存中,cup辨认一次,每次查询一次,IO操作一次。磁盘速度最慢的,过多的和磁盘打交道,查询速度不会太快。

mysql与磁盘打交道时候,是有一个磁盘单位

image.png

mysql每次从磁盘取数据,16KB的数据。

B-Tree为什么重要

所有的节点 image.png

Mysql为什么用B+Tree,不用B-Tree?

image.png

全表扫描,只要把叶子节点的数据取出

索引的离散型

哪些列做索引比较好?

离散性(count distinct col:count col)越大,重复度越高,选择性越差。1:10比较好

姓名的重复度很低,离散型越低。

image.png

联合索引

image.png

image.png

image.png

第4个效率比较高

image.png