MySQL进阶之索引

 更新时间:2023年04月09日 15:54:31   作者:兜兜转转m  
索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多,索引(index)是帮助MySQL高效获取数据的数据结构(有序),本文详细介绍了MySQL索引,感兴趣的同学可以参考阅读

索引概述

介绍

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。

索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多。

为什么要用索引呢?

假如我们有如下数据

如果我们要查询年龄=45的全部信息。

select * from tb_user where age = 45;

那么SQL是如何查询呢?

MySQL需要进行全表扫描,然后对比每条数据中的age值是否是45。

加入我们要100个数据,那你继续全表扫描找出age = 45;岂不是太麻烦了?

这是你是否想起来数据结构中二叉搜索树?我们将age的值映射到这个二叉搜索树上,那么我们就可以快速查找到我们要的结果。age 到二叉搜索树的过程就是索引。

注意:我们仅仅用二叉搜索树举例子,想信你肯定知道MySQL中的索引肯定比这个复杂。

此时我们对索引的理解更加深入了,索引仅仅是建立了一个数据结构,把数据存入到这个结构上,方便MySQL查找数据罢了。

特点

索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种

上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。

我们主要看InnoDB就可以了,因为MyISAM会被MongoDB代替,Memory会被Redis代替。

我们一般指的索引是指的是B+tree。

当然B+tree肯定不是一上来就提出来的,肯定是有一个进化的过程。

索引进化的过程

我们都知道二叉搜索树是一个方便存储的结构,因为其天然的排序。左子树都小于中间节点,右子树都大于中间节点。

但是它有什么缺点呢?在极端情况下会退化成链表。查找时间复杂度O(n),这不就等效于全表查询了?

如何克服呢?使用红黑树,因为它是一种平衡二叉树。可以避免出现链表这种极端情况。

那么是不是使用红黑树就可以了?答案:还是不行,不够理想。

为什么呢?因为是二叉树,如果MySQL中数据过多,那么将会出现树的层级过深。

我们知道数据以Page为单位存入的,在Page切换查询时会出现磁盘IO操作。层级过深就会造成IO频繁。

如何解决上述问题呢?B-Tree出场。

B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key(每个key都可以存放数据),5 个指针:

是不是使用b树就可以了呢?原则上是可以了,但是还有一种更优的方案B+Tree 代替了BTree。

MySQL中的B+Tree 和BTree有什么不同呢?

  • B+Tree只在叶子节点存储数据,从而保证每个Page中存入更多的key。
  • 叶子节点包含了根节点和非叶子节点--图中红框显示。
  • 叶子节点采用双向循环链表连接,方便查找。

 因此我们可以回答:为什么MySQL采用B+Tree呢?

到此这篇关于MySQL进阶之索引的文章就介绍到这了,更多相关MySQL索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于MySQL索引的深入解析

    关于MySQL索引的深入解析

    这篇文章主要给大家介绍了关于MySQL索引的深入解析,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 分析MySQL抛出异常的几种常见解决方式

    分析MySQL抛出异常的几种常见解决方式

    在本文中,总结了开发过程中最为常见的几种 MySQL 抛出的异常以及如何解决,包括高版本驱动的问题、时区配置问题、SSL 连接问题等。于我个人而言,这一篇足以解决目前项目中所有遇到的MySQL问题。同时,也希望本文能对 MySQL 数据库初学者有一定的引导入门作用。
    2021-05-05
  • 浅析MySQL索引结构采用B+树的问题

    浅析MySQL索引结构采用B+树的问题

    数据库的存储引擎都是采用B树或者B+树来实现索引的存储,总体来说,我认为技术方案的选型,更多的要根据具体的业务场景来决定,并不一定是说B+树就是最好的选择,就像MongoDB里面采用B树结构,本文介绍我对MySQL索引结构采用B+树的理解
    2022-06-06
  • MYSQL中的json数据操作代码

    MYSQL中的json数据操作代码

    这篇文章主要介绍了MYSQL中的json数据操作,主要包括基础查询操作,JSON函数操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • MySQL中count(*)、count(1)和count(col)的区别汇总

    MySQL中count(*)、count(1)和count(col)的区别汇总

    count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,下面这篇文章主要给大家总结介绍了关于MySQL中count(*)、count(1)和count(col)的区别,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-03-03
  • mysql修改开启允许远程连接的方法

    mysql修改开启允许远程连接的方法

    这篇文章主要为大家详细介绍了mysql修改开启允许远程连接的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • mysql数据库单表最大存储依据详解

    mysql数据库单表最大存储依据详解

    这篇文章主要为大家介绍了mysql数据库单表最大存储的依据详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • MySQL建表(create table)命令解读

    MySQL建表(create table)命令解读

    这篇文章主要介绍了MySQL建表(create table)命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 理解MySQL变量和条件

    理解MySQL变量和条件

    这篇文章主要帮助大家深入理解MySQL变量和条件,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • MySQL 案例分析讲解外连接语法

    MySQL 案例分析讲解外连接语法

    数据库的一个难题是无法将SQL语句的执行结果转换为想要的格式。本节,我们将通过学习格式转换中具有代表性的行列转换和嵌套式侧栏的生成方法,深入理解一下其中有重要作用的外连接
    2022-04-04

最新评论