当前位置: 首页 > news >正文

MySQL索引总结

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+树。这个操作叫做回表。

相关文章:

MySQL索引总结

MySQL索引总结 1.索引的概念、作用与使用场景 本质上就是减少读写磁盘的次数。 索引是一种特殊的文件&#xff0c;包含这对数据表中所有记录的引用指针&#xff0c;可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;每种类型都有对应数据结构实现。 …...

谷粒商城第十二天-基本属性销售属性管理功能的实现

目录 一、总述 二、前端部分 三、后端部分 四、总结 一、总述 前端的话&#xff0c;依旧是直接使用老师给的。 前端的话还是那些增删改查&#xff0c;业务复杂一点的话&#xff0c;无非就是设计到多个字段多个表的操作&#xff0c;当然这是后端的事了&#xff0c;前端这里…...

利用安全区域的概念解决移动端兼容不同手机刘海的问题

移动端 安全区 在做移动端的项目时&#xff0c;由于不同的手机设备设置的不同&#xff0c;有些手机在上方有刘海的设计&#xff0c;我们需要做适配&#xff0c;即把想要展示的内容放在安全区域内展示。 1.自定义导航栏 在pages.json中修改如下配置 {"path":"…...

数据结构---图

这里写目录标题 图的基本概念和术语基本概念和术语1基本概念和术语2 图的类型定义抽象数据类型定义二级目录二级目录 一级目录二级目录二级目录二级目录二级目录二级目录二级目录 图的基本概念和术语 基本概念和术语1 V代表顶点的有穷非空集合 E代表边的有穷集合 n为顶点 有向…...

励志长篇小说《周兴和》书连载之十八 内外交困搞发明

内外交困搞发明 路灯发出昏黄而惺忪的光影。 周兴和疲惫地从车间出来&#xff0c;拖着沉重的腿爬上几级石阶&#xff0c;准备回到家里去。可走到家门口&#xff0c;他想了想&#xff0c;又折了回去&#xff0c;在车间的一条长条椅子上&#xff0c;他用一块试验用的废料当枕头&…...

web基础入门和php语言基础入门 二

web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句&#xff0c;条件限…...

typeScript 之 Array

工具: PlayGround 源码&#xff1a;GitHub TypeScript 数组简介 在TypeScript中&#xff0c; 使用[]表示数组&#xff0c; 它的结构&#xff1a;let valus: 类型名[] 数据; // 数字 let numList: number[] [1, 2, 3]; // 字符串 let strList: string[] ["hello"…...

【题解】二叉树的前中后遍历

文章目录 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的前序遍历 题目链接&#xff1a;二叉树的前序遍历 解题思路1&#xff1a;递归 代码如下&#xff1a; void preorder(vector<int>& res, TreeNode* root){if(root nullptr) return;//遇到空节点…...

文件操作/IO

文件 文件是一种在硬盘上存储数据的方式&#xff0c;操作系统帮我们把硬盘的一些细节都封装起来了&#xff0c;程序员只需要了解文件相关的接口即可&#xff0c;相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据&#xff0c;和内存相比硬盘的存储空间更大&#xff0c;访问…...

基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

Mac RN环境搭建

RN ios android原生环境搭建有时候是真恶心&#xff0c;电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限&#xff0c;执行失败。因为Mac…...

log4j教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;…...

DP——背包问题

DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时&#xff0c;可以想象成一个小朋友要去旅行&#xff0c;但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包&#xff0c;每个物品都有自己的重量和价值。小朋友的目标是在不超…...

【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法

文章目录 函数参数详解一、缺省参数二、不定长参数三、缺省参数在*args后面可变、不可变类型总结 进阶案例 函数参数详解 一、缺省参数 调用函数时&#xff0c;缺省参数的值如果没有传入&#xff0c;则取默认值。 下例会打印默认的age&#xff0c;如果age没有被传入&#xf…...

10个经典战略分析模型,助力洞察市场明确优势

在企业的经营管理过程中&#xff0c;要时刻清晰内外部环境和自身的优劣势&#xff0c;做好企业略规划&#xff0c;进行企业内外部资源的分析&#xff0c;对经营环境&#xff0c;企业核心竞争力有足够的判断&#xff0c;才能明确企业的发展方向。本文为大家分享10个常用的战略分…...

C++(Qt)软件调试---将调试工具安装到AeDebug(11)

C(Qt)软件调试—将调试工具安装到AeDebug&#xff08;11&#xff09; 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容&#x1f449;个…...

浅谈限流式保护器在住宅电气防火的应用

安科瑞 华楠 【摘要】随着人民生活水平的提高&#xff0c;家用大功率电器普遍被使用&#xff0c;导致用电量剧增&#xff0c;电气火灾频发。文章分析了电气火灾发生的原因&#xff0c;并时电气火灾的防范措施进行了探讨。 【关键词】电气火灾&#xff1b;原因&#xff1b;防范…...

ChatGPT助力ModStartBlog,博客写作更智能

ModStartBlog v7.1.0&#xff0c;ChatGPT 支持、界面全新优化 在数字化时代&#xff0c;博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台&#xff0c;其最新的版本v7.1.0不仅增加了ChatGPT支持&#xff0c;还对界面进行了全新…...

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中&#xff0c;这些聚合根通常会发布领域事件。Sp…...

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; 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…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...