MySQL索引总结

news2024/12/24 21:37:59

MySQL索引总结

1.索引的概念、作用与使用场景

本质上就是减少读写磁盘的次数。

索引是一种特殊的文件,包含这对数据表中所有记录的引用指针,可以对表中的一列或多列创建索引,并指定索引的类型,每种类型都有对应数据结构实现。

  • 加快查找速度(常用数据库操作是增删改查,但是查是最常见的)
  • 增加了增删改的开销(调整时还需要调整目录)
  • 增加了空间的开销(还需要额外的空间保存索引)

一般对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量比较大并且经常对他们进行条件查询
  • 这些表的插入操作和这个列的修改频率较低
  • 索引占用的额外空间

注意:加上索引不一定快

当数据量很少,一行一行查可能会更快;

另外,如果对大量重复数据加索引,也是无法提高查询速度。例如都是性别字段,大学里的年级字段

索引创建好之后,不需要手动创建,直接查询的时候就会自动走索引。

SQL是通过数据库的执行引擎来执行的,执行引擎会自动评估,哪种方案是成本最低的,速度最快的。

具体某次查询是走的索引还是不走,可以通过explain关键字显示查询过程中具体情况。不过,使用比较简单,复杂的是分析(暂存疑问:怎么分析explain执行的结果)

//eg:
explain select * from student;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFmCFOT1-1692010130477)(F:\typora插图\image-20230813140952527.png)]

2.索引的使用方法

查看索引

show index from 表名;

容易发现,我们并未手动添加索引,但是也能查询的到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvnEKklZ-1692010130478)(F:\typora插图\image-20230813134427973.png)]

这是因为创建主键约束,唯一约束和外键约束时,数据库会自动创建对应列的索引。

创建索引

针对非主键非唯一约束非外键字段,可以创建普通索引:

create index 索引名 on 表名;

注意:创建索引最好是在创建表的时候就把索引弄好。否则,如果针对一个可能有很多记录的表创建索引是一个危险操作。中途创建可能吃掉大量磁盘io,花掉很长时间,这段时间数据库是不能正常使用的。

例如:针对学生姓名创建索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rUJA3YxN-1692010130478)(F:\typora插图\image-20230813135007596.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fI8WTB3P-1692010130479)(F:\typora插图\image-20230813135034453.png)]

删除索引

drop index 索引名 on 表名;

注意:删除索引也可能吃掉大量磁盘IO,也是比较危险的操作

例如:删除刚刚创建的索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Mu9FeA3-1692010130479)(F:\typora插图\image-20230813135943128.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsTLRts3-1692010130479)(F:\typora插图\image-20230813140022915-16919064235821.png)]

3.索引在MySQL中数据结构

索引本质是就是通过已知信息查找相关完整信息,那么我们知道的数据结构中关于查找的有哈希表、二叉搜索树、N叉搜索树和B+树。

但MySQL中InnoDB引擎中使用的是B+树。

为什么这个数据引擎不使用前三种?下边是可能的考量因素:

Why not

哈希表

哈希表是一种查询开销为O(1)的数据结构,但是哈希表不适合做数据库的索引。

因为哈希表只能比较相等,而不能进行><这样的范围查询,而进行数据库查询时经常会有这样的场景,例如查找id大于0小于10的用户信息。

二叉搜索树

二叉搜索树的前序遍历是有序的,可以进行范围查询,但是因为当二叉搜索树元素个数很多或者节点分布不均匀时,树的高度就会比较高,对应的时间复杂度就可能达到O(N),元素比较的次数就会比较多,而数据库进行比较都是要读硬盘的,这样效率就会比较低。

N叉搜索树

顾名思义,N叉搜索树就是每个节点最多有N个孩子节点的搜索树,分叉变多,树的高度是降下来了。其中最典型的实现就是B树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXn30Aai-1692010130479)(F:\typora插图\image-20230814151349302.png)]

因为节点是存储在硬盘上的,如果采用B树的方式存索引的话,树的高度降低,比较的次数虽然没有显著减少,一个节点可能需要比较多次,但是读写硬盘的次数能减少。

但是MySQL中没有使用B树,因为实际开发中对性能的要求比较高,所以使用的就是B+树。

Why B+树

B+树也是一个N叉搜索树,是B树的plus版本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72Pf5NdD-1692010130480)(F:\typora插图\image-20230814152634595.png)]

它具有以下特点:

  1. 每个节点可能存在N个key,N个key值划分出N个区间,最后一个key就是当前区间的右边界,也就是最大值
  2. 父元素的key值会在子元素中重复出现,并且是以最大值的姿态出现的。这样的重复出现就会使得叶子结点中包含所有数据的全集,非叶子结点的所有值都会在叶子结点中体现出来。
  3. 叶子结点会以类似于链表连接起来。

这些特点使得B+树具有相较于前边几种数据结构不具有的优势

  1. 更适合范围查询
  2. 树的高度降下来之后,比较的次数减少,磁盘IO的次数也就减少了
  3. 每个数据查询的时间开销比较均匀。因为所有的查询都是要落在叶子结点上的,所以不管查询那个数据,比较的次数都差不多。
  4. 空间开销会减少。由于所有的key都会在叶子结点中体现,所以非叶子节点中并不需要存储真实的数据行,只需要存储索引的值,而数据行存储在叶子结点上。这样当数据量非常大的时候,成本可以降低。

因此,既可以满足MySQL索引的功能需求也能满足它的性能要求,所以用B+树做MySQL的索引的数据结构

无索引和多索引的情况

无索引的时候,应该是以表的形式组织表这样的结构的

单索引的时候很大概率是以上述的B+树进行组织的,以学生表为例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cEjoBDr-1692010130480)(F:\typora插图\image-20230814155321980.png)]

而多索引时会创建多个B+树,以学生表中有主键索引和姓名索引(自定义索引)为例。

这时会构造两个B+树,一个是类似上边的通过主键创建B+树,叶子结点是真实的数据行,另一个是通过自定义索引创建B+树,叶子结点是主键id。因此通过非主键列查询数据行的时候,会先查一遍索引列的B+树,再查一遍主键列的B+树。这个操作叫做回表。

提醒

关于索引,建议在最开始的时候就规划好,如果是已经有大量数据,再进行操作,就需要慎重考虑!!!

是真实的数据行,另一个是通过自定义索引创建B+树,叶子结点是主键id。因此通过非主键列查询数据行的时候,会先查一遍索引列的B+树,再查一遍主键列的B+树。这个操作叫做回表。

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

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

相关文章

大数据必回之LSM树

LSM树&#xff08;Log-Structured-Merge-Tree&#xff09;并不像B、红黑树一样是一颗严格的树状数据结构&#xff0c;它其实是一种存储结构&#xff0c;像HBase、RocksDB这些NoSQL存储都是采用LSM树。它是一种分层、有序、面向磁盘的数据结构&#xff0c;核心思想是顺序写性能远…

Leetcode链表篇 Day3

.24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 1.构建虚拟结点 2.两两一组&#xff0c;前继结点一定在两两的前面 3.保存结点1和结点3 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 1.双指针&#xff1a;快慢指针 两个指针的差…

初步认识OSI/TCP/IP一(第三十八课)

1 初始OSI模型 OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是一个由国际标准化组织&#xff08;ISO&#xff09;和国际电报电话咨询委员会&#xff08;CCITT&#xff09;联合制定的网络通信协议规范&#xff0c;它将网络通信分为七个不…

React antd tree树组件 - 父子节点没有自动关联情况下 - 显示半选、全选状态以及实现父子节点互动

实现的效果图如下&#xff1a; 如Ant Design Vue 中所示&#xff0c;并没有提供获取半选节点的方法&#xff0c;当设置checked和checkStrictly时&#xff0c;父子节点也不再自动关联了 前提&#xff1a;从后端可以获取的数据分别是完整的树型数据、所有选中的节点数据&#…

在pycharm中对使用脚本文件运行的程序进行调试

在github中下载的许多项目都可以使用给出的脚本文件运行&#xff0c;本文介绍如果在pycharm中对使用脚本文件运行的程序进行调试的方法。 1.点击 edit configurations 2.选择要debug的py文件&#xff0c;并且填写参数 3.点击运行旁边的debug按钮

odoo16 tree视图没有导出按钮

odoo16 tree视图没有导出按钮 做了一个odoo应用,很奇怪,同样的角色,不同的用户,有些有导出按钮,有些没有,一直没搞清楚为啥, 今天刚好有时间,好好研究一下. 1 先按浏览器F12,导出按钮对应的html: <button type"button" class"btn btn-secondary fa fa-dow…

理解持续测试,才算理解DevOps

软件产品的成功与否&#xff0c;在很大程度上取决于对市场需求的及时把控&#xff0c;采用DevOps可以加快产品交付速度&#xff0c;改善用户体验&#xff0c;从而有助于保持领先于竞争对手的优势。 作为敏捷开发方法论的一种扩展&#xff0c;DevOps强调开发、测试和运维不同团队…

使用BP插件captcha-killer识别图片验证码绕过系统验证码机制

使用BP插件captcha-killer绕过验证码 前置条件 1、下载安装插件 burp2020前使用&#xff1a;https://github.com/c0ny1/captcha-killer/tree/0.1.2 burp2020后使用&#xff1a;https://github.com/Ta0ing/captcha-killer-java8 2、导入插件 分为三个部分&#xff1a;上面为验…

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于朴素贝叶斯算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 模型原理&#xff1a; 朴素贝叶斯分类是基于贝叶斯定理的一种分类方法。它假设特征之间相互…

【一定要会】为ChatGPT插上翅膀的5个常用插件!

自从ChatGPT接入插件功能后&#xff0c;便不再受限于预训练数据中的知识&#xff0c;第三方开发者也可以基于ChatGPT增强自家应用程序的功能。自此 ChatGPT更像是一个开放的平台甚至是生态了。 截止的今年的7月20日&#xff0c;ChatGPT已经接入了700多个插件&#xff08;当然&…

智能驾驶系列报告之一:智能驾驶 ChatGPT时刻有望来临

原创 | 文 BFT机器人 L3 功能加速落地&#xff0c;政策标准有望明确 L2 发展日益成熟&#xff0c;L3 功能加速落地。根据市场监管总局发布的《汽车驾驶自动化分级》与 SAE发布的自动驾驶分级标准&#xff0c;自动驾驶主要分为 6 个级别&#xff08;0 级到 5 级&#xff0c;L0 …

五、linux系统下创建新目录的mkdir命令

mkdir命令 在Linux系统中&#xff0c;如果想要创建一个新目录&#xff0c;即文件夹&#xff0c;可以使用mkdir命令&#xff1a; 1、语法&#xff1a;mkdir [-p](可以不存在) Linux路径(必须存在) 2、基础操作&#xff1a;mkdir 目录名 &#xff08;1&#xff09;方法一&…

pytest数据驱动(最简单)

目录 第一种&#xff1a;通过yaml文件获取数据&#xff08;一维列表&#xff09; 第二种&#xff1a;通过yaml文件获取数据&#xff08;二维列表&#xff09; 第三种&#xff1a;通过yaml文件获取数据&#xff08;pytest.fixture&#xff09; 资料获取方法 第一种&#xff…

【Vue-Router】别名

后台返回来的路径名不合理&#xff0c;但多个项目在使用中了&#xff0c;不方便改时可以使用别名。可以有多个或一个。 First.vue <template><h1>First Seciton</h1> </template>Second.vue&#xff0c;Third.vue代码同理 UserSettings.vue <tem…

【需求输出】流程图输出

文章目录 1、什么是流程图2、绘制流程图的工具和基本要素3、流程图的分类和应用场景4、如何根据具体场景输出流程图 1、什么是流程图 2、绘制流程图的工具和基本要素 3、流程图的分类和应用场景 4、如何根据具体场景输出流程图

ARTS 挑战打卡的第9天 --- 如何知道一个数是否为2的若干次幂(Algorithm)

前言 &#xff08;1&#xff09;今天看到一个有意思的问题&#xff0c;如何判断一个数字是否为2的若干次幂。这个问题并不难&#xff0c;但是对于我们的C语言功底还是有一点点的考验的。 &#xff08;2&#xff09;希望各位可以先自行思考&#xff0c;实在想不出来再看后面的讲…

WPF 本地化的最佳做法

WPF 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式&#xff0c;选择合适的才是最好的。这里只讨论一种方式&#xff0…

Sencha Ext.NET Crack,构建Blazing快速应用

Sencha Ext.NET Crack,构建Blazing快速应用 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程序&a…

【Spring专题】Bean的生命周期流程图

目录 前言阅读指引 流程图一、之前推测的简单流程图&#xff08;一点点参考&#xff09;*二、Bean生命周期流程图&#xff08;根据Spring源码自结&#xff09;*三、阶段源码流程图&#xff08;不断更新&#xff09; 前言 我向来不主张【通过源码】理解业务&#xff0c;因为每个…

Ubuntu18.04 GitHub提交代码

一、准备工作 1.1安装 git sudo apt-get install git安装完成后&#xff0c;检查git版本&#xff0c;一般自带2.17.1版本 git --version 1.2 注册github SSH keys 1.2.1 github 进入注册github SSH keys 如图&#xff0c;到GitHub上右上角圆形图标进入Settings 左侧点击S…