【MySQL数据库】----MySQL的索引

article/2025/11/3 11:34:02

目录

1.初识MySQL索引

2.索引的劣势

3.和索引相关的一些sql

4.索引背后的数据结构

4.1HashTable

4.2.顺序表和链表

4.3.二叉搜索树

4.4.AVL树

5.B树

5.1B树的优势和劣势

6.B+树(升级版B树)

7.量身定做 B+ 树

8.总结

9.参考博文

1.​​​​​​一文搞懂MySQL索引所有知识点(建议收藏)_敖丙-CSDN博客_mysql索引知识点 

2.Mysql索引整理总结_阿飞云-CSDN博客_mysql索引csdn

3.MySQL数据库几种常用的索引类型使用介绍 - mysql数据库栏目 - 红黑联盟


1.初识MySQL索引

MySQL的索引的建立对MySQL的高效运行时很重要的,索引可以大大提高MySQL的检索速度

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

2.索引的劣势

索引的主要目的就是提高查找效率,但是效率提高了,总是要付出一些代价

索引就相当于书的目录,对于一般的书目录比较少,但是如果内容巨大呢,就要耗费许多纸张来创建目录,索引也是这样,对于企业的数据库,数据量一般都特别的大,索引消耗的空间也就特别的大,而后续对数据库的内容进行修改,同样也需要对索引进行修改,拖慢了整体的增删查改


3.和索引相关的一些sql

--查看索引
show index from 表名;
--创建索引
creat index 索引名字 on 表名(列名);
--删除索引
drop index 索引名字 on 表名; 

创建和删除索引是一件非常低效的事,尤其是当前表里已经有很多数据的时候,如果未来在公司操作线上数据库,如果这个表没有索引不能贸然的去创建和删除索引 


4.索引背后的数据结构

4.1HashTable

我们使用Hash表存储表数据Key可以存储索引列,Value可以存储行记录或者行磁盘地址。Hash表在等值查询时效率很高,时间复杂度为O(1);但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。但是哈希表并不能作为范围查找以及“大于小于”的数据库所使用

4.2.顺序表和链表

根据顺序表和链表的结构,想要查找就必须要遍历,显然也不符合我们的要求 

4.3.二叉搜索树

 关于二叉搜索树:每个父节点最多有两个子节点,左子树的值小于右子树

但是二叉搜索树的时间复杂度是o(n),这是为什么呢?

一般我么所说的二叉搜索树的时间复杂度是考虑最坏的情况,那就是二叉搜索树变成一个单枝树 

如果是一个单枝树,当数据越多的时候,树的高度就越来越高,而高度就对应这比较次数,就大大增加了磁盘IO

磁盘IO的概念_letterwuyu的专栏-CSDN博客_磁盘io

4.4.AVL树

AVL树是一颗高度平衡的二叉树。

既然解决了搜索树变成单枝树的可能,那么用AVL树应该就可以了吧,但是结果依旧不行

理由:

1.AVL树的时间复杂度是logN。树的高度有多高,数据库就要检索多少次,每个节点的读取,都对应一次磁盘 IO 操作,树的高度就相当于磁盘IO的次数,磁盘每次寻道时间为10ms。假设有一百万个数据,logN就等于20,time = 20 * 0.1 = 2s。这只是一百万的数据,对于一般的企业来说,数据的数量远不止一百万。

2.平衡二叉树不支持范围查询快速查找,范围查询时需要从根节点多次遍历,查询效率不高。


MySQL的数据是存储在磁盘文件中的,查询处理数据时,需要先把磁盘中的数据加载到内存中,磁盘IO 操作非常耗时,所以我们优化的重点就是尽量减少磁盘 IO 操作。访问二叉树的每个节点就会发生一次IO,如果想要减少磁盘IO操作,就需要尽量降低树的高度。那如何降低树的高度呢?

5.B树

1.B树的每个节点上都会存储N 个 key 值

2.N 个key 值就划分出了N+1个区间

3.每个区间都对应一个子树

4.所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接

5.1B树的优势和劣势

优势:

降低了树的高度,减少了磁盘的IO

劣势:

每个节点的比较次数变多了

6.B+树(升级版B树)

 1.B+树也是一个 N 叉树

2.每个节点上都包含多个 key 值

3.如果每个节点有 N 个key ,就分成 N 个区间

4.父节点的值都会在子节点中体现出来,非叶子结点中的每一个值最终都会在叶子结点中体现出来

5.父节点中的值会作为子节点中的最大值或者最小值

6.最下面的叶子结点使用链表进行顺序连接

7.量身定做 B+ 树

B+树,作为B树的升级版,在B树基础上,MySQL在B树的基础上继续改造,使用B+树构建索引。B+树和B树最主要的区别在于非叶子节点是否存储数据的问题

  • B树:非叶子节点和叶子节点都会存储数据。
  • B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

1.使用 B+树进行查找的时候,整体的IO次数也是较少

2.所有的查询最终都会落到叶子结点上,每次查询的IO次数都是差不多的,查询速度稳定

3.叶子结点用链表连接之后,非常适合进行范围查找

4.所有的数据存储(载荷)都是放到叶子结点上的,非叶子结点中值保存key值即可,因此非叶子结点整体占用的空间较小,甚至可以缓存到内存当中(一旦能够完全放到内存当中,这个时候磁盘的IO几乎就没了)

8.总结

MySQL改善查询性能改善的最好方式,就是通过数据库中合理地使用索引!

一般当数据量较大的时候,遇到sql查询性能问题,首先想到的应该是查询的sql时候使用了索引,如果使用了索引性能还是提高不大,就要检查索引是否使用正确,索引是否在sql查询中生效了!

如果索引生效了,并且索引的使用也是合理的,最后sql性能还是不高,那就考虑重新优化sql语句!

9.参考博文

1.​​​​​​一文搞懂MySQL索引所有知识点(建议收藏)_敖丙-CSDN博客_mysql索引知识点 

2.Mysql索引整理总结_阿飞云-CSDN博客_mysql索引csdn

3.MySQL数据库几种常用的索引类型使用介绍 - mysql数据库栏目 - 红黑联盟


http://chatgpt.dhexx.cn/article/u9ODv9Xc.shtml

相关文章

数据库(mysql)索引

目录 一、索引概念 2、索引优点和缺点 1、优点 2、缺点 3、创建索引的原则依据 二、索引的分类和创建 1、普通索引(标志MUL) 1、直接创建索引 2、修改表结构的方式创建索引 3、创建表的时候指定索引 2、唯一索引(标志NUI&#x…

MySql 数据库【索引】

MySql 数据库【索引】 1. 什么是索引?2. 索引的实现原理?3. 添加索引的条件?4. 索引的操作1. 创建索引2. 删除索引3. 查看一个sql语句是否使用了索引进行检索 5. 索引的失效6. 索引的类型 1. 什么是索引? 索引是在数据库表的字段…

【MySQL数据库】MySQL索引

MySQL索引、事务与存储引擎 一、索引1.1索引的概念1.2索引的作用1.3索引的工作原理1.4索引的副作用1.5索引的应用场景 二、索引的创建与分类2.1普通索引,最基本的索引类型,没有唯一性之类的限制。2.2唯一索引2.3 主键索引2.4组合索引2.5全文索引 三、删除…

MySQL数据库索引机制

文章目录 一、MySQL缓冲区二、MySQL的page1.认识单个page2.认识多个页3.聚簇索引和非聚簇索引 三、索引的操作1.创建主键索引2.创建唯一索引3.创建普通索引4.查询索引的方法5.删除索引的方法6.索引创建原则 一、MySQL缓冲区 MySQL是一款有客户端和服务端的网络应用&#xff0c…

MySQL数据库索引教程(超详细)

索引初步 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 …

【MySql】数据库索引

数据库索引 索引索引的创建索引的查看索引的删除 聚簇索引 & 非聚簇索引聚簇索引非聚簇索引 索引创建原则 索引 可以简单理解为一本书的目录信息,是为了提升查找效率而建立的 索引的创建 1、在创建一个主键、唯一键、外键时候,数据库会自动地针对查…

MySQL 数据库--索引

目录 前言 一、索引及分类 1.索引的概念 2.索引的作用 3.索引的副作用 4.索引的分类 4.1 普通索引 4.2 唯一性索引 4.3 主键索引 4.4 全文索引 4.5 组合索引(单列索引与多列索引) 5.创建索引的原则依据 二、创建及查看索引 1.准备 2.创建索…

MYSQL数据库-索引

MYSQL数据库-索引 零、前言一、索引概念二、认识磁盘三、理解索引1、如何理解Page2、B vs B3、聚簇索引 VS 非聚簇索引4、普通索引5、总结 四、索引操作1、创建索引2、查询索引3、删除索引 零、前言 本章主要讲解MYSQL数据库中的索引这一重要知识点 一、索引概念 索引的价值&a…

MySQL数据库:索引

一、索引简介 1.概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 相当于是给数据库中的数据建立了一个目录,通过目录可以知道…

MySQL数据库的索引

文章目录 一、索引是什么?索引的作用 二、索引的使用查看索引创建索引删除索引 三、索引的底层 一、索引是什么? 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型&a…

Mysql数据库索引详解

一、前言 随着我们业务量不断的增大,会发现查询数据库的时间变的越来越长,其实就是数据库到达了性能的瓶颈,这时候需要我们对其进行优化操作,可能我们第一时间就会想到:加索引。没错,这是优化的一个方向&a…

MySQL 数据库--索引(理论详解及实例演示)

文章目录 前言一、索引及分类1.索引的概念2.索引的作用3.索引的副作用4.索引的分类4.1 普通索引4.2 唯一性索引4.3 主键索引4.4 全文索引4.5 组合索引(单列索引与多列索引) 5.创建索引的原则依据 二、创建及查看索引1.准备2.创建索引的方法2.1 创建普通索…

数据库-mysql之索引

目录 1、索引简介 1.1 索引的含义和特点 1.2 索引的分类 1、普通索引 2、唯一性索引 3、全文索引 4、单列索引 5、多列索引 6、空间索引 1.3 索引的设计原则 1.选择唯一性索引 2.为经常需要排序、分组和联合操作的字段建立索引 3&#xff0…

web前端页面开发工具的演进史

小编是一位有着6年前端开发经验的web前端开发工程师&#xff0c;今天小编从个人的视角来聊一聊web前端开发工具的演进史。 小编第一次接触 web前端开发是在2011年&#xff0c;那会还在上高中。当时正是大家都每天忙碌着装扮自己的QQ空间。那时的web前端布局还是以 <table&g…

关于Webpack前端工程化构建,你必须要掌握这些核心知识点

引言 在很久之前&#xff0c;模块化管理还没有出现&#xff0c;如果我们开发一个页面想要引入一些依赖的话&#xff0c;最常见的做法就是将依赖文件引入到.html文件中。比如&#xff0c;我们要使用JS的一些依赖库&#xff0c;就要在.html文件中使用<script>标签引用&…

构建工具 Vite、Webpack、Rollup对比

Webpack介绍 热更新方面&#xff1a;webpack支持HMR&#xff0c;但是webpack需要全部重新编译并更新&#xff0c;效率较低tree-shaking&#xff1a;webpack2开始支持且消除效果不好&#xff0c;但是webpack5有更好的tree-shaking&#xff08;去除未使用代码&#xff09;分包方…

前端三大构建工具 Webpack、Vite、Rollup 优劣势及原理分析

在刚刚结束的 VueConf2021 中&#xff0c;除了 Vue 3.0 以外&#xff0c;另外一个亮点就是下一代构建工具 Vite 了。 在尤雨溪分享的【 Vue 3 生态进展和计划】的演讲中&#xff0c;尤大神还特意提到 Vite 将成为 Vue 的现代标配。甚至最近新推出的 Petite Vue 从开发、编译、发…

从Npm Script到Webpack,6种常见的前端构建工具对比

从Npm Script到Webpack&#xff0c;6种常见的前端构建工具对比 小编说&#xff1a;历史上先后出现了一系列构建工具&#xff0c;它们各有优缺点。由于前端工程师很熟悉JavaScript&#xff0c;Node.js又可以胜任所有构建需求&#xff0c;所以大多数构建工具都是用Node.js开发的。…

前端开发入门:前端构建工具百度FIS

FIS是什么&#xff1f; FIS全称为Front-end Integrated Solution&#xff0c;即前端集成解决方案。前端团队发展大多会经历规范设计、技术选型、系统拆分、性能优化等阶段&#xff0c;其中的技术需求可以总结为前端集成解决方案。FIS是专为解决前端开发中自动化工具、性能优化…

前端工程化——构建工具选型

一、什么是前端工程化 前端工程化是依据业务特点&#xff0c;将前端开发的规范、流程、技术、工具、经验等形成规范并建立成一种标准的体系。 二、为什么要前端工程化 实现前端工程化的目的简单来说就是通过流程规范、自动化工具来提升前端的开发效率、性能、质量、多人协作…