首页 > 数据库 >Mysql索引详解

Mysql索引详解

时间:2024-08-02 11:27:06浏览次数:14  
标签:存储 MySQL Tree 主键 索引 详解 Mysql 节点

1索引

1.1索引概述

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

1.1.1特点

索引特点
优势 劣势
提高数据检索的效率,降低数据库 的IO 成本 索引列也是要占用空间的。
通过索引列对数据进行排序,降低 数据排序的成本,降低CPU的消 耗。 索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行 INSERT 、 UPDATE 、 DELETE 时,效率降低。

1.2 索引结构

1.2.1 概述

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

索引结构 描述
B+Tree 索引 最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash 索引 底层数据结构是用哈希表实现的 , 只有精确匹配索引列的查询才有效 , 不 支持范围查询
R-tree(空间索 引) 空间索引是 MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引 ) 是一种通过建立倒排索引 , 快速匹配文档的方式。类似于 Lucene,Solr,ES
上述是 MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持情况。
索引 InnoDB MyISAM Memory
B+tree 索引 支持 支持 支持
Hash 索引 不支持 不支持 支持
R-tree 索引 不支持 支持 不支持
Full-text 5.6 版本之后支持 支持 不支持
注意: 我们平常所说的索引,如果没有特别指明,都是指 B+ 树结构组织的索引。

1.2.2二叉树

假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构如下:

如果主键是顺序插入的,则会形成一个单向链表,结构如下:

 

所以,如果选择二叉树作为索引结构,会存在以下缺点:
  • 顺序插入时,会形成一个链表,查询性能大大降低。
  • 大数据量情况下,层级较深,检索速度慢。
此时大家可能会想到,我们可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数 据,最终形成的数据结构也是一颗平衡的二叉树 , 结构如下: 但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:
  • 大数据量情况下,层级较深,检索速度慢

所以,在 MySQL 的索引结构中,并没有选择二叉树或者红黑树,而选择的是 B+Tree ,那么什么是 B+Tree 呢?在详解 B+Tree 之前,先来介绍一个 B-Tree 。

1.2.3 B-Tree

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

1.2.4 B+Tree  

B+Tree 是 B-Tree 的变种,我们以一颗最大度数( max-degree )为 4 ( 4 阶)的 b+tree 为例,来看一 下其结构示意图: 我们可以看到,两部分:
  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。

B+Tree 与 B-Tree相比,主要有以下三点区别:

  • 所有的数据都会出现在叶子节点。
  • 叶子节点形成一个单向链表。
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。
上述我们所看到的结构是标准的 B+Tree 的数据结构,接下来,我们再来看看 MySQL 中优化之后的 B+Tree 。 MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree ,提高区间访问的性能,利于排序。

 

1.2.5 Hash  

MySQL 中除了支持 B+Tree 索引,还支持一种索引类型 ---Hash 索引。 1). 结构 哈希索引就是采用一定的 hash 算法,将键值换算成新的 hash值,映射到对应的槽位上,然后存储在 hash 表中。

 

如果两个 ( 或多个 ) 键值,映射到一个相同的槽位上,他们就产生了 hash 冲突(也称为 hash碰撞),可以通过链表来解决。 2). 特点 A. Hash 索引只能用于对等比较 (= , in) ,不支持范围查询( between , > , < , ... ) B. 无法利用索引完成排序操作 C. 查询效率高,通常 ( 不存在 hash 冲突的情况 ) 只需要一次检索就可以了,效率通常要高于 B+tree 索 引 3). 存储引擎支持 在 MySQL 中,支持 hash 索引的是 Memory 存储引擎。 而 InnoDB 中具有自适应 hash 功能, hash 索引是 InnoDB 存储引擎根据 B+Tree 索引在指定条件下自动构建的。

1.3 索引分类 

1.3.1 索引分类

在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

分类 含义 特点 关键字
主键索引 针对于表中主键创建的索引 默认自动创建 , 只能有一个 PRIMARY
唯一索引 避免同一个表中某数据列中的值重复 可以有多个 UNIQUE   
常规索引 快速定位特定数据 可以有多个
全文索引 全文索引查找的是文本中的关键词,而不是比较索引中的值 可以有多个 FULLTEXT

 1.3.2 聚集索引&二级索引

而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类 含义 特点
聚集索引(ClusteredIndex) 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据 必须有 ,而且只有一个
二级索引(SecondaryIndex) 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 可以存在多个
聚集索引选取规则 :
  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索 引。

 聚集索引和二级索引的具体结构如下:

  • 聚集索引的叶子节点下挂的是这一行的数据 。
  • 二级索引的叶子节点下挂的是该字段值对应的主键值。

 接下来,我们来分析一下,当我们执行如下的SQL语句时,具体的查找过程是什么样子的。

具体过程如下 : ① . 由于是根据 name 字段进行查询,所以先根据 name='Arm' 到 name 字段的二级索引中进行匹配查 找。但是在二级索引中只能查找到 Arm 对应的主键值 10 ② . 由于查询返回的数据是 * ,所以此时,还需要根据主键值 10 ,到聚集索引中查找 10对应的记录,最终找到 10 对应的行 row 。 ③ . 最终拿到这一行的数据,直接返回即可。

 

回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取 数据的方式,就称之为回表查询。

标签:存储,MySQL,Tree,主键,索引,详解,Mysql,节点
From: https://blog.csdn.net/qq_62602995/article/details/140866736

相关文章

  • bing官方api搜索引擎
    bing官方api搜索引擎1.bingAPI说明微软Bing的搜索API使得开发者能够将Bing的搜索能力集成到自己的应用中,包括对网页、图片、新闻、视频的搜索,以及提供了实体搜索和视觉搜索的功能。这些API支持安全、无广告且能够根据地理位置提供相关信息的搜索结果。BingWebSearch......
  • 【Mysql】索引哪些情况会失效
    索引失效场景当使用索引列进行查询时,最终会到主键索引树查询对应的数据进行返回,理论上来说使用了索引列查询,能很好的提高查询效率,但是不规范的使用,会使索引失效。1.索引列使用函数在索引列上做运算,比如使用函数,会导致mysql无法识别索引列,查询的时候就不会走索引了。不过mys......
  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo
    Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo1.前提是咱们的Chatchat服务一起部署好了,可以参考Langchain-Chatchat3.1版本docker部署流程——知识库问答2.搜索引擎DuckDuckGo:该搜索引擎不需要key,但是需要全球上网服务,挂代理。pipinstall-Uduckduckgo_search......
  • 【Mysql】Docker下Mysql8数据备份与恢复
    目录【Mysql】Docker下Mysql8数据备份与恢复1创建Mysql容器2连接Mysql3Binlog检查3.1检查是否开启3.2mysql5.73.3mysql84备份数据库4.1容器里执行备份4.2宿主机执行备份4.3参数说明5定时备份!/bin/bash按shift+:输入wq【Mysql】Docker下Mysql8数据备份与恢复1......
  • SQL命令详解
    countCOUNT()函数COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。COUNT()函数有两种使用方式:使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。下面......
  • MySQL优化insert 语句
    当进行数据INSERT的时候,可以考虑采用以下几种优化方式:(1)如果同时从同一客户插入很多行,应尽量使用多个值表的INSERT语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗,使得效率比分开执行的单个INSERT语的快(在大部分情况下,使用多个值表的NSERT语句能比单个INSERT语向......
  • 24-7-31String类,StringBuffer类,StringBuilder类的详解与比较
    24-7-31String类,StringBuffer类,StringBuilder类的详解与比较文章目录24-7-31String类,StringBuffer类,StringBuilder类的详解与比较StringString的结构String的方法String对象的两种创建方法String的其他方法String练习StringExercise01StringExercise02StringExer......
  • Redis和Mysql如何保持数据一致性
    一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有命中,就去从数据库中查询,查询到数据之后再把这个数据缓存到Redis里。 如果一......
  • grep命令详解:文本搜索的利器
    grep命令详解:文本搜索的利器大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!grep是一个强大的命令行工具,用于在文件中搜索特定的文本模式。它是Unix和类Unix系统中最常用的工具之一,广泛应用于系统管理、日志分析、代码查找等场景。本文将详细介绍grep命令......