MySQL索引:让你的数据库查询快到起飞!

news2024/11/25 0:33:08

💕世界上最美好的东西之一,就是你每天都有机会开始全新的一天。💕
🐼作者:不能再留遗憾了🐼
🎆专栏:MySQL学习🎆
🚗本文章主要内容:详细介绍如何查看、创建和删除MySQL索引,以及MySQL索引的底层原理:B+树。🚗
在这里插入图片描述

前言

各位朋友们,大家好!前面我们已经介绍了MySQL的库和表操作,今天我将为大家分享使数据库查询更加高效的MySQL索引,如果大家觉得博主的文章对你有用的话,记得点个赞哦!😘

什么是MySQL索引

MySQL索引是一种用于加速对MySQL数据库表中数据的查找的数据结构。它可以帮助MySQL数据库在查询时快速定位到所需数据,从而提高查询效率。

MySQL索引基于数据表的某一列或多列创建,并按照一定的算法进行排序存储,以快速地返回符合条件的数据。通常情况下,索引可以被创建在表的主键列、唯一约束列、普通列上,其中主键和唯一约束列上的索引是最常用的。

使用索引可以有效地加快查询操作的速度,但也会增加写操作的开销。因此,在创建索引时需要根据实际情况进行权衡考虑。

MySQL索引的作用

1.提高查询速度:索引可以加速MySQL数据库执行SELECT查询语句的速度。MySQL在查询时可以利用索引直接定位到所需的数据行,而不必遍历整个数据表。

2.保证数据的唯一性:在MySQL数据库中,主键或唯一约束列上的索引能够保证数据的唯一性,避免重复数据的出现。

3.提高排序速度:当对某一个列进行ORDER BY操作时,MySQL可以利用索引进行快速排序,避免在内存中执行排序操作所造成的效率低下。

4.加速数据表的连接:当数据表之间进行JOIN操作时,MySQL可以利用索引快速定位所需数据,并将其连接成需要的结果。

MySQL索引适合在哪些场景下使用

因为MySQL索引虽然提高了查询的效率,但是也需要付出一定的代价。

1.需要付出额外的空间代价来保存索引数据
2.索引可能会拖慢新增、删除、修改的速度

MySQL索引通常在一下场景下使用:

1.经常查询的列:如果一个列经常被用于 SELECT 或 WHERE,那么它应该被索引。这种情况下,索引可以大大提高查询的性能。

2.唯一性列:主键、唯一性约束条件和外键都应该创建索引,这可以确保数据表的数据唯一性,并保证数据表间连接的性能。

3.经常连接的表:如果两个或多个表经常出现在 JOIN 语句中,那么创建这些表之间连接所需的列上的索引,可以大大提高查询的性能。

4.经常排序的列: 如果一个数据表中的某个列经常出现在 ORDER BY 子句中,那么索引可以大大提高排序操作的速度。

5.经常分组的列: 如果一个数据表中的某个列经常用于聚合操作(如SUM、COUNT、AVG等),那么索引可以大大提高聚合操作的性能。

如何使用MySQL索引

查看索引

show index from 表名

在这里插入图片描述
每一列所表示的含义:

Table:索引所属的数据表名。
Non_unique:这个索引是否是唯一索引。如果值为0,表示是唯一索引;如果值为1,表示非唯一索引。
Key_name:索引的名称。
Seq_in_index:索引中字段的位置。索引可以涉及到多个字段,这个字段标识了当前字段在索引中的位置。
Column_name:索引所在的列名。
Collation:索引的字符集。
Cardinality:索引中的唯一值的数量。
Sub_part:索引使用的列的前缀长度。
Packed:索引是否使用压缩。
Null:索引是否可以插入空值。
Index_type:索引的类型,可能是BTREE、HASH、FULLTEXT等。
Comment:关于索引的一些注释信息。

创建索引

create index 索引名 on 表名(列名);

查看表结构

desc student;

在这里插入图片描述
创建索引并查看

create index index_sn on student(sn);
show index from student;

在这里插入图片描述

删除索引

drop index 索引名 on 表名
drop index index_sn on student;
show index from student;

在这里插入图片描述

MySQL索引的底层结构

MySQL索引的底层结构不是二叉搜索树和哈希表,而是B+树。说到B+树,大家可能都知道还有一个B树,B+树是在B树的基础上发展来的。

B树

🎁B树是一种多路查找树,用于在大小可变的文件中进行查找和排序。B树通常被用来实现数据库或文件系统中的数据结构,它具有平衡读写性能、支持数据的动态更新和查询复杂度低等优点。
🙌B树的基本思想是将关键字和数据元素按序存储在树的结点中,并按特定规则组织树形结构。B树的每个结点最多可以有m个子树,若结点中存储的关键字数为n,那么该结点中应有n+1个指向子树的指针。B树的关键字按大小顺序排列,且结点中所有关键字不重复。

下面就是一个简单的B树

在这里插入图片描述

B树的特点:
1.B树可以高效地支持多路查找。通过对结点进行平衡,B树的查找性能稳定,在最坏情况下仅需要O(log n)的时间复杂度即可在树结构中查找到一个关键字。

2.B树可以高效地支持数据的动态更新和平衡。通过在插入和删除操作中对树的平衡进行自我调整,B树能够高效地对数据的动态更新进行处理。

3.B树的每个结点可以存储更多的关键字和数据元素,进而减少磁盘I/O的次数,提高整体的查找和排序性能。

B+树

B+树是一种多路查找树,是B树的一种变种。B+树与B树的主要区别是:B+树的非叶子结点只包含导航信息,不包含实际数据;B+树的关键字只出现在叶子结点中,而且叶子结点本身按关键字大小顺序存储,且相邻叶子结点通过指针连接。

在这里插入图片描述
📱B+树的特点:

1.B+树的非叶子结点不存储数据,只存储导航信息。这种设计可以使得B+树的内部结构更加紧凑,从而减少树的高度,提高查询效率。

2.B+树的所有叶子结点都包含了相同的信息,因此可以很方便地实现区间查找或范围查找。这种设计也提高了B+树的查询性能。

3.类似B树,B+树也是平衡树,每个节点内部都包含多个关键字,能够有效支持多值查找和排序。

4.B+树的叶子结点之间可以用指针串接起来,形成一个有序链表,因此可以支持快速的区间遍历和排序数据。

🏀B+树的优势:
1.更快的查找性能:B+树在非叶子节点只存储索引信息,数据都存放在叶子节点中。当进行查找时,只需要从根节点开始往下遍历,每个非叶子节点只需要加载一次就能定位到数据所在的叶子节点,从而大大提高了查询效率。

2.更高的稳定性:B+树的非叶子节点只存储索引,而数据都存放在叶子节点中。当叶子节点变化时,只会对叶子节点进行操作,而非叶子节点不会改变,这种特性大大增加了数据结构的稳定性,减少了出错率。

3.适应范围更广:B+树能够适应更广范围的磁盘IO操作,因为B+树的叶子节点都是通过链表相互连接的,能够更加快速地支持区间查找和遍历操作,适用于海量数据存储和查询场景。

4.更高的顺序访问性能:由于B+树的叶子节点是按顺序进行存储的,因此能够更加快速地进行顺序遍历操作,特别是在需要频繁进行范围查询操作的场景,能够极大地提升性能。

注意

当表中存在一个主键索引时,如果还存在另一个索引,那么还是以主键索引为主构建B+树,叶子节点组织所有的数据行,而另一个非主键索引也会额外构架一个B+树,但是这个 B+ 树的叶子节点就不再存储这一行的完整数据,而是存主键的索引,还需要通过主键 索引 去主键的 B+ 树里再查一次(查两次 B+ 树),这个过程被称为回表

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

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

相关文章

SSD、内存和 L1 Cache 相比速度差多少倍

一道面试题:SSD、内存和 L1 Cache 相比速度差多少倍? 其实比起复杂的技术问题,我更喜欢在面试中提问这种像生活常识一样的简单问题。因为我觉得,复杂的问题是由简单的问题组成的,如果你把简单的问题学扎实了&#xff…

自动化运维工具—Ansible

一、Ansible概述 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配…

面试问题总结---嵌入式部分和项目部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

面试问题总结----ROS部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

Python3.9使用最新版pyinstaller将项目或程序打包成exe或者mac中的可执行文件

1、pyinstaller的说明: pyinstaller 能够在 Windows、Linux、Mac 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。 PyInstaller 支…

NLP-基于bertopic工具的新闻文本分析与挖掘

NLP-基于bertopic工具的新闻文本分析与挖掘 一,前言 最近简单接触了一些NLP的内容,练一下如何结合ChatGPT进行学习。 二,具体过程 (1)预处理文本,记录处理过程。 在使用Bertopic进行主题建模之前&…

【数据库一】MySQL数据库初体验

MySQL数据库初体验 1.数据库基本概念1.1 数据Data1.2 表1.3 数据库1.4 数据库管理系统1.5 数据库系统 2.数据库的发展3.主流的数据库介绍3.1 SQL Server(微软公司产品)3.2 Oracle (甲骨文公司产品)3.3 DB2(IBM公司产品…

MySQL-索引详解(五)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

【K8S系列】深入解析k8s网络之—网络故障

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

FasterTransformer 005 初始化:如何将参数传给模型?

cpp的例子 device_malloc cpp没有用具体数值初始化 float *d_from_tensor NULL;device_malloc(&d_from_tensor, batch_size * seq_len * hidden_dim);https://github1s.com/NVIDIA/FasterTransformer/blob/v1.0/sample/cpp/transformer_fp32.cc#L35-L38 直接用的cudaMal…

【电子学会】2023年03月图形化四级 -- 绘制直尺

绘制直尺 编写一段程序,绘制一段7厘米的直尺。 1. 准备工作 (1)保留小猫角色,隐藏; (2)白色背景。 2. 功能实现 (1)点击绿旗,设置笔的颜色为红色&#…

事务和事务的隔离级别

一、事务 (一)为什么需要事务 事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事…

数字图像处理期末复习习题 SCUEC part1

1.在利用LoG算子做边缘检测的时候,作为一种经验法则,当滤波器空间参数为a7时,LoG滤波器空域模板大小应为 答:4343 理由是:n大于等于6a1 2.空间域方法主要分为灰度变换和空间滤波两类,灰度变换在图像的单…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器(了解&#xff09…

SpringBatch从入门到实战(三):父子Job和多步骤控制

一:Job嵌套 Job之前也可以嵌套,比如一个父Job封装多个已经存在的子Job。 Configuration public class ChildrenJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic…

基础知识学习---牛客网C++面试宝典(八)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

Golang每日一练(leetDay0096) 添加运算符、移动零

目录 282. 给表达式添加运算符 Expression Add Operators 🌟🌟🌟 283. 移动零 Move Zeroes 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 …

Cenos7 --- Redis下载和安装(Linux版本)

1.下载和安装 Download | Redis进入官网Download | Redis, 上边点击下载7.0.11,右键复制下载衔接 https://download.redis.io/releases/redis-7.0.2.tar.gz 1.weget获取 我这个安装包放在 /tools/installbags下 cd /tools/installbags wget https://download.red…

Java进阶 —— Java多线程编程笔记

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

【头歌-Python】9.3 中英文词云绘制(project) 第1~3关

第1关:词云练习1 任务描述 本关任务:编写一个能制作词云的小程序。 相关知识 词云 词云,也叫文字云,是一种应用广泛的数据可视化方法。是过滤掉文本中大量的低频信息,形成“关键词云层”或“关键词渲染”&#xf…