MySQL索引总结
MySQL索引总结
1.索引的概念、作用与使用场景
本质上就是减少读写磁盘的次数。
索引是一种特殊的文件,包含这对数据表中所有记录的引用指针,可以对表中的一列或多列创建索引,并指定索引的类型,每种类型都有对应数据结构实现。
- 加快查找速度(常用数据库操作是增删改查,但是查是最常见的)
- 增加了增删改的开销(调整时还需要调整目录)
- 增加了空间的开销(还需要额外的空间保存索引)
一般对数据库表的某列或某几列创建索引,需要考虑以下几点:
- 数据量比较大并且经常对他们进行条件查询
- 这些表的插入操作和这个列的修改频率较低
- 索引占用的额外空间
注意:加上索引不一定快
当数据量很少,一行一行查可能会更快;
另外,如果对大量重复数据加索引,也是无法提高查询速度。例如都是性别字段,大学里的年级字段
索引创建好之后,不需要手动创建,直接查询的时候就会自动走索引。
SQL是通过数据库的执行引擎来执行的,执行引擎会自动评估,哪种方案是成本最低的,速度最快的。
具体某次查询是走的索引还是不走,可以通过explain关键字显示查询过程中具体情况。不过,使用比较简单,复杂的是分析(暂存疑问:怎么分析explain执行的结果)
//eg: explain select * from student;
2.索引的使用方法
查看索引
show index from 表名;
容易发现,我们并未手动添加索引,但是也能查询的到:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvnEKklZ-1692010130478)(F:\typora插图\image-20230813134427973.png)]](https://img-blog.csdnimg.cn/af1c6ecbe3b84d99b58ba4fe17aa5145.png)
这是因为创建主键约束,唯一约束和外键约束时,数据库会自动创建对应列的索引。
创建索引
针对非主键非唯一约束非外键字段,可以创建普通索引:
create index 索引名 on 表名;
注意:创建索引最好是在创建表的时候就把索引弄好。否则,如果针对一个可能有很多记录的表创建索引是一个危险操作。中途创建可能吃掉大量磁盘io,花掉很长时间,这段时间数据库是不能正常使用的。
例如:针对学生姓名创建索引
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rUJA3YxN-1692010130478)(F:\typora插图\image-20230813135007596.png)]](https://img-blog.csdnimg.cn/4be994d9b52445028a42d11c3cae0d4e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fI8WTB3P-1692010130479)(F:\typora插图\image-20230813135034453.png)]](https://img-blog.csdnimg.cn/e96c5ef8772b4473b2b3f397f06116de.png)
删除索引
drop index 索引名 on 表名;
注意:删除索引也可能吃掉大量磁盘IO,也是比较危险的操作
例如:删除刚刚创建的索引
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Mu9FeA3-1692010130479)(F:\typora插图\image-20230813135943128.png)]](https://img-blog.csdnimg.cn/520fe35f0f984d289619dbc6d0b7c508.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsTLRts3-1692010130479)(F:\typora插图\image-20230813140022915-16919064235821.png)]](https://img-blog.csdnimg.cn/fd4d5bfe64b543cdad0d8641a64dc5ab.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)]](https://img-blog.csdnimg.cn/15e6dec893464d5ba680636acb9ab79d.png)
因为节点是存储在硬盘上的,如果采用B树的方式存索引的话,树的高度降低,比较的次数虽然没有显著减少,一个节点可能需要比较多次,但是读写硬盘的次数能减少。
但是MySQL中没有使用B树,因为实际开发中对性能的要求比较高,所以使用的就是B+树。
Why B+树
B+树也是一个N叉搜索树,是B树的plus版本。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72Pf5NdD-1692010130480)(F:\typora插图\image-20230814152634595.png)]](https://img-blog.csdnimg.cn/8bfee95620a24e1599cc16d1d2ef20f9.png)
它具有以下特点:
- 每个节点可能存在N个key,N个key值划分出N个区间,最后一个key就是当前区间的右边界,也就是最大值
- 父元素的key值会在子元素中重复出现,并且是以最大值的姿态出现的。这样的重复出现就会使得叶子结点中包含所有数据的全集,非叶子结点的所有值都会在叶子结点中体现出来。
- 叶子结点会以类似于链表连接起来。
这些特点使得B+树具有相较于前边几种数据结构不具有的优势
- 更适合范围查询
- 树的高度降下来之后,比较的次数减少,磁盘IO的次数也就减少了
- 每个数据查询的时间开销比较均匀。因为所有的查询都是要落在叶子结点上的,所以不管查询那个数据,比较的次数都差不多。
- 空间开销会减少。由于所有的key都会在叶子结点中体现,所以非叶子节点中并不需要存储真实的数据行,只需要存储索引的值,而数据行存储在叶子结点上。这样当数据量非常大的时候,成本可以降低。
因此,既可以满足MySQL索引的功能需求也能满足它的性能要求,所以用B+树做MySQL的索引的数据结构
无索引和多索引的情况
无索引的时候,应该是以表的形式组织表这样的结构的
单索引的时候很大概率是以上述的B+树进行组织的,以学生表为例:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cEjoBDr-1692010130480)(F:\typora插图\image-20230814155321980.png)]](https://img-blog.csdnimg.cn/44ee8d3e808c4b41aec0c8097b463a51.png)
而多索引时会创建多个B+树,以学生表中有主键索引和姓名索引(自定义索引)为例。
这时会构造两个B+树,一个是类似上边的通过主键创建B+树,叶子结点是真实的数据行,另一个是通过自定义索引创建B+树,叶子结点是主键id。因此通过非主键列查询数据行的时候,会先查一遍索引列的B+树,再查一遍主键列的B+树。这个操作叫做回表。
提醒
关于索引,建议在最开始的时候就规划好,如果是已经有大量数据,再进行操作,就需要慎重考虑!!!
是真实的数据行,另一个是通过自定义索引创建B+树,叶子结点是主键id。因此通过非主键列查询数据行的时候,会先查一遍索引列的B+树,再查一遍主键列的B+树。这个操作叫做回表。
相关文章:
MySQL索引总结
MySQL索引总结 1.索引的概念、作用与使用场景 本质上就是减少读写磁盘的次数。 索引是一种特殊的文件,包含这对数据表中所有记录的引用指针,可以对表中的一列或多列创建索引,并指定索引的类型,每种类型都有对应数据结构实现。 …...
谷粒商城第十二天-基本属性销售属性管理功能的实现
目录 一、总述 二、前端部分 三、后端部分 四、总结 一、总述 前端的话,依旧是直接使用老师给的。 前端的话还是那些增删改查,业务复杂一点的话,无非就是设计到多个字段多个表的操作,当然这是后端的事了,前端这里…...
利用安全区域的概念解决移动端兼容不同手机刘海的问题
移动端 安全区 在做移动端的项目时,由于不同的手机设备设置的不同,有些手机在上方有刘海的设计,我们需要做适配,即把想要展示的内容放在安全区域内展示。 1.自定义导航栏 在pages.json中修改如下配置 {"path":"…...
数据结构---图
这里写目录标题 图的基本概念和术语基本概念和术语1基本概念和术语2 图的类型定义抽象数据类型定义二级目录二级目录 一级目录二级目录二级目录二级目录二级目录二级目录二级目录 图的基本概念和术语 基本概念和术语1 V代表顶点的有穷非空集合 E代表边的有穷集合 n为顶点 有向…...
励志长篇小说《周兴和》书连载之十八 内外交困搞发明
内外交困搞发明 路灯发出昏黄而惺忪的光影。 周兴和疲惫地从车间出来,拖着沉重的腿爬上几级石阶,准备回到家里去。可走到家门口,他想了想,又折了回去,在车间的一条长条椅子上,他用一块试验用的废料当枕头&…...
web基础入门和php语言基础入门 二
web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句,条件限…...
typeScript 之 Array
工具: PlayGround 源码:GitHub TypeScript 数组简介 在TypeScript中, 使用[]表示数组, 它的结构:let valus: 类型名[] 数据; // 数字 let numList: number[] [1, 2, 3]; // 字符串 let strList: string[] ["hello"…...
【题解】二叉树的前中后遍历
文章目录 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的前序遍历 题目链接:二叉树的前序遍历 解题思路1:递归 代码如下: void preorder(vector<int>& res, TreeNode* root){if(root nullptr) return;//遇到空节点…...
文件操作/IO
文件 文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问…...
基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
Mac RN环境搭建
RN ios android原生环境搭建有时候是真恶心,电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限,执行失败。因为Mac…...
log4j教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;…...
DP——背包问题
DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时,可以想象成一个小朋友要去旅行,但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包,每个物品都有自己的重量和价值。小朋友的目标是在不超…...
【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法
文章目录 函数参数详解一、缺省参数二、不定长参数三、缺省参数在*args后面可变、不可变类型总结 进阶案例 函数参数详解 一、缺省参数 调用函数时,缺省参数的值如果没有传入,则取默认值。 下例会打印默认的age,如果age没有被传入…...
10个经典战略分析模型,助力洞察市场明确优势
在企业的经营管理过程中,要时刻清晰内外部环境和自身的优劣势,做好企业略规划,进行企业内外部资源的分析,对经营环境,企业核心竞争力有足够的判断,才能明确企业的发展方向。本文为大家分享10个常用的战略分…...
C++(Qt)软件调试---将调试工具安装到AeDebug(11)
C(Qt)软件调试—将调试工具安装到AeDebug(11) 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug(11)1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容👉个…...
浅谈限流式保护器在住宅电气防火的应用
安科瑞 华楠 【摘要】随着人民生活水平的提高,家用大功率电器普遍被使用,导致用电量剧增,电气火灾频发。文章分析了电气火灾发生的原因,并时电气火灾的防范措施进行了探讨。 【关键词】电气火灾;原因;防范…...
ChatGPT助力ModStartBlog,博客写作更智能
ModStartBlog v7.1.0,ChatGPT 支持、界面全新优化 在数字化时代,博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台,其最新的版本v7.1.0不仅增加了ChatGPT支持,还对界面进行了全新…...
Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案
Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中,这些聚合根通常会发布领域事件。Sp…...
Vue3组件库
Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目(yarn) D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…...
[MediaForge] 音频技术深度解析(五):常见问题与快速解决
目录 问题排查方法论 音频采集常见问题 音频重采样常见问题 音频编码常见问题 音频封装常见问题 端到端完整流程问题 快速定位工具集 AI 辅助排查指南 1. 问题排查方法论 1.1 通用排查流程 ┌───────────────────────────────────────…...
多元化团队从多元化投资机构开始
初创企业往往口头上重视多元化,但在实际招聘实践中却行动缓慢。对于成长阶段的公司来说,从熟悉的硅谷人才渠道招聘是阻力最小的路径,但如果创始人想要一个多元化的团队,就必须从第一个员工开始将这一价值观付诸实践。Taskrabbit创…...
KiloClaw:为企业AI代理安全合规保驾护航
OpenClaw托管版KiloClaw:企业AI代理管理新方案由GitLab联合创始人Sid Sijbrandij和Scott Breitenother共同创立的Kilo,推出了面向企业的KiloClaw,它是OpenClaw平台的托管版本。该产品旨在为企业提供对员工使用AI代理执行代码库监控、邮件起草…...
RefluxJS终极部署指南:从开发到生产的完整工作流程
RefluxJS终极部署指南:从开发到生产的完整工作流程 【免费下载链接】refluxjs A simple library for uni-directional dataflow application architecture with React extensions inspired by Flux 项目地址: https://gitcode.com/gh_mirrors/re/refluxjs Re…...
你的微信记忆银行:三分钟学会永久保存珍贵聊天记录
你的微信记忆银行:三分钟学会永久保存珍贵聊天记录 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMs…...
架构实战:清洁机器人梯控系统技术路线对比与非侵入式状态机设计
摘要: 商用清洁机器人(如大型洗地机)的跨层调度,是典型的 OT(操作技术)与 IT(信息技术)深度融合场景。在评估不同厂家的机器人梯控系统时,底层架构的安全性与物理容错率是…...
AI辅助数据库设计:让快马平台的Kimi模型成为你的课程设计智能顾问
今天在完成数据库课程设计作业时,我尝试用InsCode(快马)平台的AI辅助功能来设计医院门诊预约系统,整个过程比想象中顺利很多。作为一个数据库初学者,这种智能辅助开发的方式确实帮我解决了不少难题,下面记录下具体实现过程和经验。…...
STM32F103ZET6【标准库函数开发】-----TM1638模块驱动4位8段共阴极数码管
1. 硬件环境搭建 第一次接触TM1638模块时,我手头正好有块吃灰的正点原子战舰开发板。这个组合对初学者特别友好,就像乐高积木一样容易上手。先说说需要准备的硬件清单: 正点原子STM32F103ZET6开发板(其他型号也行,但引…...
EB Garamond 12免费复古字体:完整指南与快速上手教程
EB Garamond 12免费复古字体:完整指南与快速上手教程 【免费下载链接】EBGaramond12 项目地址: https://gitcode.com/gh_mirrors/eb/EBGaramond12 EB Garamond 12是一款基于16世纪经典Garamond字体设计的开源免费字体,完美复刻文艺复兴时期的印刷…...
解放科研效率:用这款开源工具让图表数据提取效率提升80%
解放科研效率:用这款开源工具让图表数据提取效率提升80% 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 在科研和工程领域&…...

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