一、为什么要建立索引?

  • 索引是帮助MySQL高效获取数据的排好序的数据结构(本质是一种优化查询的数据结构)
  • 索引存储在文件里
  • 索引结构(索引底层的数据结构)
    • 二叉树
    • 红黑树
    • Hash
    • B-树

存在表Test,表的字段分别为:Col 1和Col 2,为该表的Col 2 字段添加索引。为了方便理解,假设索引底层用的数据结构是二叉搜索树,则如下图:

我们都知道,MySQL数据库中的表中的数据是存储在磁盘上的。即该Test表的数据是存储在磁盘上的。如果我们有SQL语句:

SELECT Col1, Col2  FROM Test WHERE Col2 = 89;

现在要查找 Col 2 = 89 这条记录。CPU必须先去磁盘查找这条记录,找到之后加载到内存,再对数据进行处理。这个过程最耗时间的就是磁盘I/O(涉及到磁盘的旋转时间(速度较快)、磁头的寻道时间(速度慢、费时))。

如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找Col 2 = 89 这条记录,就要逐行去查找、去比较。从Col 2 = 34 开始,进行比较,发现不是,继续下一行。。。我们当前的Test表只有不到10行数据,但如果表很大的话,有上千万条数据,就意味着要做很多很多次磁盘I/O才能找到。速度是很慢的。

所以,这就是我们为什么要建索引,目的就是为了减少磁盘I/O的次数 ,加快查询速率。

二、索引如何工作?

上图中的Test表中,对字段Col 2 添加了索引,就相当于在硬盘上为Col 2维护了一个索引的数据结构,即这个二叉搜索树。二叉搜索树的每个结点存储的是(K,V)结构,key 是Col 2,value 是该 key 所在行的文件指针(地址)。比如:该二叉搜索树的根节点就是:(34,0x07)。

现在对 Col 2 添加了索引,这时再去查找 Col 2 = 89 这条记录的时候会先去查找该二叉搜索树(二叉树的遍历查找)。

读 34 到内存,89>34;

读 89 到内存,89 == 89;//找到了

找到之后就根据当前结点的value快速定位到要查找的记录对于的地址。我们可以发现,只需要查找两次就可以定位到记录的地址,查询速度就提高了。

三、MySQL中意的索引结构是B+树

但其实,MySQL底层索引用的数据结构是B+树。不过大体思路是一样的。那么,为啥不用二叉搜索树、AVL树、红黑树这些数据结构呢?

3.1  二叉搜索树的局限性

假设现在Col 2属性的值为(10,14,15,25,58),那么最终形成的二叉搜索树的结构是这样的:

我们发现,二叉搜索树出现了单边增长的情况,在这种情况下,二叉搜索树退化成了线性结构,和顺序查找(不建立索引)的效率差不多。因此要想最大性能的构造一个二叉搜索树,需要这个二叉搜索树是平衡的。也就是努力减少每个结点的左子树和右子树之间的高度差。这时就出现了AVL树。

3.2 AVL树

AVL树是带有平衡条件的二叉搜索树。所有结点的左右子树的高度差不超过1。同样对于(10,14,15,25,58),构造出来的AVL树的结构是这样的:

3.3 红黑树

根据红黑树的特点,构造出来是这样的:

这两种树结构相对普通的二叉搜索树,优化了一些,那么到底为什么不用AVL树、红黑树呢?:

1)这两种结构在插入数据之后,一般要调整树的结构来实现平衡,是比较耗性能的;

2)最主要的原因还是:二叉树查找的效率跟树的高度有关。每次查找都是一次磁盘I/O。在对上千万的数据进行查找时,这两种结构的高度还是太高了,影响查找效率。

3.4 B-树

为了减少树的高度,那我们就可以把树设计的“矮胖”一些。这时就能想到B-树。它类似普通的二叉查找树,不同的一点是B-树允许每个结点有更多的子结点。

优点:

  1. 一个结点里有多个元素,并且是非递减排列的;
  2. 所有叶节点具有相同的深度,等于树高。

缺点:

  1. 一个结点中存放多少元素比较合适;
  2. 范围查找时需要回溯结点;

3.5 B+树

B+树和B树的区别就是:B+树的非叶子结点只包含导航信息,不包含实际的值。所有的叶子结点相连,便于区间遍历和查找。

所以最终MySQL索引用的就是B+树。

到底什么是索引???相关推荐

  1. 子查询到底走不走索引?

    CREATE TABLE zichaxuntest ( a int(11) NOT NULL, b varchar(255) DEFAULT NULL, c varchar(255) DEFAULT ...

  2. 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  3. mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  4. Mysql中到底什么是索引下推,一分钟看懂

    索引条件下推(Index Condition Pushdown),简称ICP.MySQL5.6新添加,用于优化数据的查询. 理论 索引下推简单来说就是把索引当中的所有数据全部用到减少回表的次数 假如现 ...

  5. 用新华字典来彻底解释清:数据库索引到底是什么

    点击上方蓝字设为星标 下面开始今天的学习- 作者:兜里有辣条 来源:segmentfault.com/a/1190000018153249  说在前面  数据库超级重要,这个大家应该清楚,学过数据库的 ...

  6. Sql Server之旅——第九站 看看DML操作对索引的影响

    我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,同时也知道建索引是需要维护成本的,这个维护也就在于DML操作,下面具体看看到底DML对索引都有哪些内幕.... 一:delete操作 现在大 ...

  7. bcp 不能调用where 子句_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    不知道从什么时候开始,网上流传着这么一个说法: MySQL的WHERE子句中包含 IS NULL.IS NOT NULL.!= 这些条件时便不能使用索引查询,只能使用全表扫描. 这种说法愈演愈烈,甚至 ...

  8. PostgreSQL 优化器案例之 - order by limit 索引选择问题

    标签 PostgreSQL , limit , order by , 优化器 , 选择性 , 相关性 , 数据存储顺序 , 目标数据存储顺序 背景 当我们在执行一个这样的SQL时,假如有这样几个索引( ...

  9. mysql中b树是什么_MySQL优化中B树索引知识点总结

    为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 SQL语句执行过程分 ...

最新文章

  1. 人工智能从业者:大牛,工程师和调参狗
  2. 苹果又魔改安卓? iOS 15 正式发布、可跨设备移动文件,这届 WWDC21 带来了什么?...
  3. 集大通100%任务完成度签到
  4. ARM/THUMB汇编(补丁开发类)基础教程
  5. matlab求傅里叶级数展开式_简单粗暴傅里叶级数
  6. python中将整数转化为八进制的函数,Python进制转化
  7. feach同步 git_git fetch 更新远程代码到本地仓库
  8. vscode中自动修复eslint的项目语法错误
  9. 2021Java面经:史上最全的《Java面试题及解析》
  10. java中多线程常见面试题
  11. Ubuntu18.04下OpenCV调用笔记本摄像头
  12. BEC高级商务英语考试应试技巧指南
  13. 解决Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
  14. android卡通头像,Face V(卡通头像制作)
  15. 《Loy解说Eureka服务端源码(二)》
  16. MATLAB 中contour的应用
  17. 去除ubuntu u盘只读的解决办法
  18. MySQL练习(一)
  19. 初识MyBatis Plus
  20. Sqlmap速查表/功能移植/Python批量检测SQL注入

热门文章

  1. 最细致全面架设外网传奇教程
  2. SAS 时间秒 转换成多少小时,多少分钟,多少秒
  3. ASP.NET CORE的服务注册方法
  4. 解决Microsoft OneNote不能登录https://onedrive.live.com的问题
  5. 公历农历显示节日节气星期等万年历
  6. 邮箱每日发送有上限吗?各大邮箱每天限制发信数量多少?
  7. 华为首款台式机计算机发布,华为首款商用台式机一文读懂:商用PC进入智慧时代...
  8. 思科模拟器Cisco Packet Tracer交换机的端口聚合配置
  9. 树莓派驱动低成本双目VR摄像头
  10. 无法显示计算机列表,W7系统Internet Explorer无法显示该页面