MySQL 8 索引原理详细分析

千山万水总是情,

问问索引行不行?

轻舟已过万重山,

有种尽管来发难。

索引是在数据库优化时的重要手段之一,今天 V 哥从索引的角度展开讲一讲索引的各个要点,希望可以通过这篇文章,帮助大家彻底搞透索引的关键点。

  • 1.索引的定义与作用
  • 2.索引的类型
  • 3.索引原理
  • 4.二分查找法
  • 5.Hash结构
  • 6.B+Tree 结构
  • 7.聚簇索引和辅助索引
  • 8.索引分析与优化
  • 9.查询优化
  • 10.索引的优势与劣势

1.索引的定义与作用

索引是数据库中的一种数据结构,它允许数据库管理系统(DBMS)快速检索表中的数据。索引的主要目的是提高查询效率,它通过提供一个快速查找机制来减少数据检索所需的时间。没有索引的数据库表被称为堆表,其查询效率通常较低,尤其是在处理大量数据时。

2.索引的类型

  • 普通索引:基本的索引类型,无特殊限制。
  • 唯一索引:索引字段值必须唯一,允许有空值。
  • 主键索引:特殊的唯一索引,不允许空值。
  • 复合索引:在多个列上建立的索引。
  • 全文索引:适用于文本数据的搜索,支持自然语言查询。

3.索引原理

  • 索引是存储引擎用于快速查找记录的数据结构,存储在数据文件中。
  • 索引可以加快数据检索速度,但会降低增删改操作速度。
  • 索引涉及的理论知识包括二分查找法、Hash 结构和 B+Tree 结构。

当执行查询时,MySQL首先检查是否可以使用索引来加快查询速度。如果可以,MySQL会使用索引来定位数据。索引查找的过程通常如下:

  1. 初始化:从根节点开始,根节点包含整个表的索引信息。
  2. 遍历:根据查询条件,沿着树向下遍历到相应的叶子节点。
  3. 查找:在叶子节点上进行查找,找到匹配的键值。
  4. 回表(对于辅助索引):如果使用的是辅助索引,需要根据叶子节点中的指针回聚簇索引中查找完整的数据记录。

4. 二分查找法

二分查找法也叫作折半查找法,它是在有序数组中查找指定数据的搜索算法。它的优点是等值查询、范围查询性能优秀,缺点是更新数据、新增数据、删除数据维护成本高。

  • 首先定位left和right两个指针
  • 计算(left+right)/2
  • 判断除2后索引位置值与目标值的大小比对
  • 索引位置值大于目标值就-1,right移动;如果小于目标值就+1,left移动

举个例子,下面的有序数组有17 个值,查找的目标值是7,过程如下:

  • 第一次查找

  • 第二次查找

  • 第三次查找

  • 第四次查找

5. Hash结构

Hash底层实现是由Hash表来实现的,是根据键值 <key,value> 存储数据的结构。非常适合根据key查找value值,也就是单个key查询,或者说等值查询。其结构如下所示:

  • 从上面结构可以看出,Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。
  • Hash索引在MySQL 中Hash结构主要应用在Memory原生的Hash索引 、InnoDB 自适应哈希索引。
  • InnoDB提供的自适应哈希索引功能强大,接下来重点描述下InnoDB 自适应哈希索引。
  • InnoDB自适应哈希索引是为了提升查询效率,InnoDB存储引擎会监控表上各个索引页的查询,当InnoDB注意到某些索引值访问非常频繁时,会在内存中基于B+Tree索引再创建一个哈希索引,使得内存中的 B+Tree 索引具备哈希索引的功能,即能够快速定值访问频繁访问的索引页。
  • InnoDB自适应哈希索引:在使用Hash索引访问时,一次性查找就能定位数据,等值查询效率要优于B+Tree。
  • 自适应哈希索引的建立使得InnoDB存储引擎能自动根据索引页访问的频率和模式自动地为某些热点页建立哈希索引来加速访问。另

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言模拟试题一

模拟试题一 一、选择题(本大题30 分,每小题2 分) 1下列说法正确的是。 E) main函数必须放在C程序的开头 F) main函数必须放在C程序的最后 G) main函数可以放在C程序的中间部分,但在执行C程序时是从程序开头执 行的 H) main函数可以放在C 程序的中间部分,但在执行C 程序时…

Redis 不再“开源”:中国面临的挑战与策略应对

Redis 不再“开源”&#xff0c;使用双许可证 3 月 20 号&#xff0c;Redis 的 CEO Rowan Trollope 在官网上宣布了《Redis 采用双源许可证》的消息。他表示&#xff0c;今后 Redis 的所有新版本都将使用开源代码可用的许可证&#xff0c;不再使用 BSD 协议&#xff0c;而是采用…

leetcode 1035.不相交的线

思路&#xff1a;最长公共子序列的动态规划问题。 其实简单来说就是将最长公共子序列那道题的字符串改成了数字而已&#xff0c;其实都是一样的&#xff0c;那么我就在这里不多讲了&#xff0c;如果要看思路可以看博主这篇leetcode 1143.最长公共子序列-CSDN博客 注意&#x…

玩一下Proxmox,硬盘扩容

问题 今天用proxmox系统新建了一个debian系统,当时只是见识下,发现还很好用,于是就又加了一块存储盘,如何扩容,过程记录一下。 扩容过程 1.首先要给proxmox添加硬盘,是一个旧的,所以分区怎么也删不干净,只好用下面的命令清零 dd if=/dev/zero of=/dev/sdb bs=512 co…

C++进阶学习(5)继承中的重名成员与静态成员

文章目录 一、重名成员1.重名数据成员2.重名成员函数 二、派生类中访问静态成员 一、重名成员 派生类定义了与基类同名的成员&#xff0c;在派生类中访问同名成员时屏蔽了基类的同名成员 在派生类中使用基类的同名成员&#xff0c;显式地使用类名限定符&#xff1a; 类名 :: …

dapr学习

dapr学习 5.1、概念知识 官方文档&#xff1a; Dapr 配置选项概述 | Dapr 文档库 run CLI 命令参考 | Dapr 文档库 该部分持续更新中… dapr云原生框架&#xff0c;服务于开发人员的&#xff0c;是一个cs服务框架 5.2、dapr配置redis中间件组件 1、首先下载redis进行并…

国产算力芯片排行榜前十名

算力芯片是指用于进行大规模计算的集成电路芯片&#xff0c;它的性能和效率将直接影响到人工智能、大数据分析、密码学和区块链等领域的发展。近年来&#xff0c;随着国内算力芯片制造企业的迅速崛起&#xff0c;国产算力芯片在技术研发和市场表现上都取得了显著的进步。下面就…

CBO VS ABO,哪种策略才更能优化FB广告?

海外创业时&#xff0c;FB广告无疑是吸引目标受众、推动业务增长的重要渠道之一&#xff01;然而令大家头疼的却是在CBO与ABO的选择上&#xff0c;今天就带大家一起解读这两种常见的广告策略。了解两者之间的区别、优缺点及适用场景。 CBO 和 ABO 分别是什么&#xff1f; CBO&a…

从数据治理到数据资产管理,释放新质生产力

在当前的数字化浪潮中&#xff0c;数据作为第五大生产要素&#xff0c;正日益成为企业激活新质生产力的关键引擎。数据治理和数据资产管理作为数据管理的重要环节&#xff0c;对企业提升竞争力、实现数字化转型具有重大意义。本文将对数据治理和数据资产管理进行深入探讨&#…

vue3封装Element动态表单组件

1. 封装组件DymanicForm.vue 使用component实现动态组件组件不能直接使用字符串传入&#xff0c;所以根据传入的组件名称找到对应的组件校验规则&#xff0c;可使用rule传入自定义规则&#xff0c;也可以使用封装好的基本规则 示例中使用了checkRequired暴露重置方法和校验方法…

python_1

要求&#xff1a; 代码&#xff1a; # 先将分钟数转化成年数&#xff0c;再将余数做为天数 minute float(input("请输入分钟数&#xff1a;")) year_1 (minute / 60 / 24) // 365 day_1 (minute / 60 / 24) % 365 now f"{minute}分钟{year_1}年{day_1}天&q…

Cocos2dx-lua ScrollView[三]高级篇

一.概述 本文缩写说明:sv = ScrollView, cell代表ScrollView的一个子节点 本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点: 1.item的位置通过参数控制,提高开发效率 2.免去了调用sv的API,提高开发效率 3.分帧创建,提高性能 4.可通过参数控制,复用ite…

250.voc,vok 声音,叫喊

250.voc,vok 声音,叫喊 vocal  【vəukəl】 adj. 【voc 声,-al …的】 有声的;用语言表达的,口述的;歌唱的 vocalism  【vəukəlizəm】 n. 【见上,-ism 表行为】 发声;歌唱 vocalist  【vəukəlist】 n. 【见上,-ist 者】 歌唱者;声乐家 vocalize  【vəukə…

《Python编程快速上手——让繁琐工作自动化》实践项目——物品清单

题目&#xff1a; 整个题目篇幅比较大。简化一下就是编写addToInventory函数并且返回一个字典。 思路&#xff1a;函数displayInventory用于物品清单的最后输出&#xff0c;而addToInventory是用于处理战利品的&#xff0c;在原来的装备上添加&#xff0c;已有的装备直接数量加…

Nginx超详细讲解+实操

前言 nginx作为当今火爆的、高性能的http及反向代理服务&#xff0c;不管前端还是后端&#xff0c;都需要全面去了解&#xff0c;学习&#xff0c;实操。 nginx 介绍 为了有一个全面的认知&#xff0c;接下来我们先来看看nginx的架构以及一些特点。 nginx 特点 处理响应请…

安卓系统与iOS对比:两大移动操作系统各有千秋

原文地址&#xff1a;dlshuhua.com/post/79134.html 在当前的移动设备市场中&#xff0c;安卓系统和iOS系统无疑是两大主导力量。它们各自具有独特的优点和特点&#xff0c;吸引了不同需求的用户群体。本文将详细对比这两个系统&#xff0c;分析它们各自的优劣&#xff0c;以帮…

QT(C++)-error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”

1、项目场景&#xff1a; 在VS中采用QT&#xff08;C&#xff09;调试时&#xff0c;出现error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”错误 2、解决方案&#xff1a; 在“解决方案资源管理器”中选中出现此类BUG的项目&#xff0c;右键-…

静态路由表学习实验

实验要求&#xff1a;各个pc设备可以通信&#xff0c;并且可以访问外网&#xff0c;假设R1已连接外网 拓扑结构 思路&#xff1a;配置pc机ip地址&#xff0c;子网掩码&#xff0c;和网关&#xff08;网关地址是上层路由接口的地址&#xff09;&#xff0c;配置路由各个接口地址…

什么是LLM Agent?

引言&#xff1a; LLM Agent 已经成为大语言模型中最有价值的探索方向&#xff0c;也更趋于最前沿的通用人工智能。构建企业自己的 LLM Agent 有助于企业在最前沿的人工智能领域探索具有完全自主性的智能化能力&#xff0c;包括基于企业知识库、企业工具 API&#xff08;如&am…

element-plus中的日期时间选择器el-date-picker;日期选择面板中选定起始与结束的日期只能改具体的时刻,日期默认是一个月没法动态修改问题

目前遇到一个问题&#xff0c;在使用element-plus中的日期时间选择器el-date-picker&#xff0c;type为datetimerange时&#xff0c;展示的日期选择面板有两个输入框&#xff0c;开始时间和结束时间&#xff0c;element-plus只提供了default-time 使用datetimerange进行范围选择…