[MySQL]索引

索引介绍

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

    假设我们有存了100个 1~999的数字,在没有索引的情况下,数据库会对表全表扫描,如果我要查找的记录排在表的后面,那么就需要越过大半的记录才能查找到我需要的记录。此时的查找效率会很低。

    在这基础之上,如果有索引,将这些数据通过二分法插入一个二叉树中,此时我再查找这个数据,就不需要一条条记录地去比对了,此时100条记录最多查找7次就能够查找到我需要的记录,极大地提高了查找效率。(当然,数据库里的数据结构不是就只是简单的二叉树)

    当然,索引也不是只有优势没有劣势。

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

B树数据结构

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

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持 B+ 树索引
Hash索引底层数据结构是用哈希表实现的, 只有精确匹配索引列的查询才有效, 不支持范围查询
R-tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES

    上面是MySQL中支持的所有索引,当然,没有特意指明的情况,索引一般都指B+Tree索引 

B-tree

    介绍B+Tree前,还要先介绍一下B-Tree结构。B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数 (一个节点中最多存储的指针数) 为5的b-tree为例,那这个B树每个节点最多存储4个key,5 个指针:

    B-tree的特点

1.n阶的B树,每一个节点最多存储n-1个key,对应n个指针

2.若当前节点存储的key数量到达5,就会裂变,中间元素向上分裂

(例如:一个末节点的key有88、89、95、96,而上一层的key为80、100、110。这个时候添加一个97到表里,97数据会先从根节点查找到该末节点,然后将其添加到该末节点,然后95会裂变,添加到上一层中,这就是裂变)

3.在B树中,非叶子节点和叶子节点都会存放数据

    这样一来,存储时使用b-tree,依旧有一定缺陷,也因此又衍生出了B+tree,也是大多数数据库主要使用的数据结构。

B-Tree的不足

    所有的非叶子节点和叶子节点都会同时存放数据和指针。在硬盘中,存储空间是被划分为一个个块的,而B-Tree中的数据和指针混杂分散在每一个节点中。

    IO操作时,读取数据会不连续。在查询多个连续数据时,若当前节点里没有查找完需要的数据,不能直接跳转到下一个节点,还需返回上一层节点找到下一个指针,再去访问下一个节点。底层的数据操作比较繁琐。

    在添加数据时,B-Tree还会进行裂变,但B-Tree裂变时不仅影响指针还会影响数据,cpu开销比较大。

B+tree

    为了改进B-Tree树的不足,又衍生出了B+Tree。B+Tree与B-Tree类似,但有很多不同,下面这是一个最大度数为4的B+Tree结构图:

    其中,蓝色框框圈起来的部分,也就是非叶子节点,仅起到索引数据的作用,只以key-value形式存放指针,不存放具体的数据。

    红色部分是存储数据的部分,也是该树的叶子节点 ,则存放所有具体的数据内容。并且每个叶子节点中,会存放一个指向下一个叶子节点的指针(但没有指向上一个叶子节点的指针)。

    B-Tree和B+Tree的区别:

1.所有的数据都会出现在叶子节点

2.叶子节点形成一个单向链表

3.非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的

为何B+Tree比B-Tree更适合实际中操作系统的文件索引和数据库索引

     1.B+Tree的磁盘读写代价更低。B+Tree的内部节点并没有指向关键字具体信息的指针。因此其内部节点相对BTree更小,如果把所有同一内部节点的关键字存放在同一个盘块中,那么盘块所能容纳的关键字数量也越多。一次性读取到内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了

     2.B+Tree的查询效率更加稳定。由于非叶子节点不是最终指向文件内容的节点,而是叶子节点中关键字的索引,所以任何关键字的查找都必须走一条从根节点到叶子节点的路。所有关键字的路径长度相同,导致每个数据的查询效率相当

MySQL中的B+Tree

    对比普通的B+Tree,MySQL在其基础上,添加了一个指向上一个叶子节点 (首尾相连) 的指针,也就是变成了一个双链表。

索引分类 

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

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

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

分类含义特点
聚集索引将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
二级索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个

     聚集索引选取规则:

1.如果存在主键,主键索引就是聚集索引

2.如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引

3.如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

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

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

    在查询数据时,如果是通过二级索引查找数据。数据库系统会先在二级索引的目录里进行查找,获取到了对应主键值后,进行回表查询。也就拿着主键值,去聚集索引查询需要的数据。

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

    在执行查询语句时,如果能够走聚集索引,就不必要走二级索引。

    在数据库查询语句优化时,注意走聚集索引也是一个重要的优化方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9205.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

window 利用Putty免密登录远程服务器

1 在本地电脑用putty-gen生成密钥 参考1 参考2 2 服务器端操作 将公钥上传至Linux服务器。 复制上述公钥到服务器端的authorized_keys文件 mkdir ~/.ssh vi ~/.ssh/authorized_keys在vi编辑器中,按下ShiftInsert键或者右键选择粘贴,即可将剪贴板中的文…

【大数据技术基础 | 实验八】HBase实验:新建HBase表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动HBase集群(二)编写项目java代码(三)将代码导出jar包 六、实验结果七、实验心得 一、实验目的 掌握HBase数据模型(逻…

密钥管理服务 (KMS) 故障排除指南

企业客户将密钥管理服务 (KMS) 设置为部署流程的一部分,因为通过该服务,他们可以使用简单、直接的过程在其环境中激活 Windows。 通常,一旦设置了 KMS 主机,KMS 客户端就会自动连接到主机并自行激活。 然而,有时该流程…

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中,客户总是希望你的配色是美的,但是美如何定义&#xff…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络(Recurrent Neural Network, RNN)是一类网络连接中包含环路的 神经网络的总称。 给定一个序列,RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度,历史状态被循环累积,并作为…

【软考网工笔记】网络基础理论——物理层

文章目录 贝尔系统 T1 载波光纤 - SFP接口差分&&曼彻斯特编码网桥MAC-in-MACQ-in-QIPv6的链路本地地址CRC校验与计算E1载波编码效率对称xDSL坚持算法-CSMAUDP头部字段万兆以太网标准 IEEE 802.3ae海明码-纠错码ARP帧中的目标MAC地址快速以太区网物理层标准 100BASE-TXM…

现代Web开发:TypeScript 深入解析与最佳实践

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 现代Web开发:TypeScript 深入解析与最佳实践 现代Web开发:TypeScript 深入解析与最佳实践 现代Web开发&a…

HCIP MPLS基础

一、 实验拓扑 二、 实验需求及解法 本实验模拟BGP路由黑洞环境,使用MPLS LDP解决路由黑洞。 完成以下需求: 1.设备IP地址配置,请测试直连。 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0interface Loop…

Kubernetes架构及核心组件

一、基本架构 Kubernetes集群可以被看作是一个工厂,而各个组件则是这个工厂里的不同部门: Kubernetes API服务器:就像是这个工厂的总经理,负责接收所有的请求并将它们分配给相应的部门进行处理。 etcd:就像是这个工厂的记事本,负责记录所有的配置信息和状态信息,以便其…

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

聊聊基于BERT模型实现多标签分类任务的实践与思考

概述 以预训练大模型为基座神经网络模型,通过模型预训练后的泛化能力与微调后的领域能力,作为NLP任务的解决方案。 在github上找了一个简单的仓库——multi_label_classification,该仓库基于BERT预训练大模型实现了多分类任务。通过对该仓库…

C语言 【大白话讲指针(中)】

在之前的文章中我们已经知道了指针的概念,指针就是一个变量,用来存放地址,地址指向唯一一块内存空间。指针的大小是固定的4/8个字节(32为机器/64位机器)。指针是有类型的,指针的类型决定了指针加减整数的步…

大数据分析在市场营销中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 引言 大数据分析概述 定义与原理 发…

启明云端触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!

展会信息 展会日期: 2024年11月12-15日 展馆名称: 慕尼黑国际展览中心 MesseMnchen exhibition center 展馆地址: Messegelnde 81829 Mnchen Germany 启明云端&触觉智能展位号:B6-351 诚邀您莅临我司展位,让我们在慕尼黑不见不散! …

OPPO开源Diffusion多语言适配器—— MultilingualSD3-adapter 和 ChineseFLUX.1-adapter

MultilingualSD3-adapter 是为 SD3 量身定制的多语言适配器。 它源自 ECCV 2024 的一篇题为 PEA-Diffusion 的论文。ChineseFLUX.1-adapter是为Flux.1系列机型量身定制的多语言适配器,理论上继承了ByT5,可支持100多种语言,但在中文方面做了额…

【JavaEE初阶】网络原理(4)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 网络层 > IP协议 IP协议报头结构 4位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数), 16位标识 3位标志位 13位片偏移 8位生存时间(TTL) 8位协议 16位首部…

树莓派上安装与配置 Nginx Web 服务器教程

在树莓派上配置 Nginx 作为 Web 服务器的步骤如下: 1. 更新树莓派 首先,确保你的树莓派系统是最新的。打开终端并执行以下命令: sudo apt update sudo apt upgrade -y2. 安装 Nginx 在树莓派上安装 Nginx: sudo apt install …

Android Studio 中关于com.github.barteksc:android-pdf-viewer 无法正确加载的问题

Android Studio 的app 模块下,添加依赖: implementation com.github.barteksc:android-pdf-viewer:3.2.0-beta.1 运行程序报错: Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveEx…

[JAVA]Maven项目标准结构介绍

什么是Maven? Maven 是一个强大的项目管理和构建自动化工具,在Java开发中,一个项目通常会依赖许多外部的库,比如开发一个Web应用可能需要依赖Servlet APL,Spring框架等,和需要引入大量的Jar包。往往一个Ja…

Ansys EMC Plus:MHARNESS 串扰演示

Ansys EMC Plus 是一款强大的工具,专门用于分析电磁场及其影响,涵盖电磁兼容性和雷电效应分析等领域。 在本演示中,我们将探讨建立 MHARNESS 仿真的基础知识。这包括构建基本电缆线束、创建 MHARNESS 源和设置 MHARNESS 探针的过程。 概述 …