【MySQL】-索引以及树的常用数据结构分析

news2024/12/25 2:37:50

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏:【MySQL】
分享:纵一苇之所如,凌万顷之茫然。——《赤壁赋》
主要内容:MySQL中索引的介绍、创建索引、使用索引;索引背后的数据结构的分析、关于二叉搜索树、AVL树、B树、B+树这些数据结构分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文章目录

  • 一、索引
    • 1、什么是索引?
    • 2、索引的优缺点
    • 3、使用索引
      • @ 查看索引
      • @ 创建索引
      • @ 删除索引
    • 4、总结索引
  • 二、重点:索引在MySQL中的数据结构
    • 1、数据结构分析
    • 2、索引中的数据结构总结

一、索引

1、什么是索引?

可以对表中的一列或者多列创建索引,各类索引有各自的数据结构实现

原理:当查询某一项时,使用索引后,查询不是从原表中查所有数据再显示目标项,而是将索引拿来查询,数据量大大减少,从而提高查询效率。

2、索引的优缺点

优点:

  • 加快了查询操作,提高效率,因为在实际中,查的比增删改多很多。

缺点:

  • 索引提高了增删改的开销。因为索引相当于一本书的目录,每次增删改后,需要同时改变这个目录,即改索引。
  • 索引会多占用空间

3、使用索引

前提:我创建了一个student表,id为主键,还有一个name字段

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

@ 查看索引

创建表时,有主键/unique/外键,都会自动创建索引

-- 查看索引
show index from 表名
mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.04 sec)

@ 创建索引

对于一个非主键,非唯一约束,非外键约束的字段,可以采用普通索引

-- 创建索引
create index 索引名 on 表名(字段名)
mysql> create index ind_name_stu on student(name);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;--可以看到,多出了关于name的索引
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| student |          0 | PRIMARY      |            1 | id          | A         |           0 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| student |          1 | ind_name_stu |            1 | name        | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+---------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
2 rows in set (0.04 sec)

@ 删除索引

-- 删除索引
drop index 索引名 on 表名 

4、总结索引

  1. 创建表时,有主键/unique/外键,都会自动创建索引
  2. 对于一个非主键约束,非唯一约束,非外键约束的字段,可以采用普通索引
  3. 索引创建好后,查询时会自动使用索引去查,而不需要手动操作。因为SQL是通过数据库的 “执行引擎” 来执行的,这会涉及到 “优化” 操作,即在操作结果不变的前提下,“执行引擎” 去决定是否使用索引,它会选择更优的方法去操作。
  4. 索引最好在表创建之初就创建好。不然当表中数据量很大很大才创建索引时,会吃掉大量的磁盘IO,花很长时间(几十分钟到几个小时)。并且在这段时间内,数据库无法被正常使用。
  5. 基于上一条原因,和数据库删库删表一样,索引也是一个危险操作
  6. 对一个字段有重复内容时,索引可以支持,但是可能不能提高效率,比如我对学生表的性别字段给个索引,不能提高查找效率,这其实是没有意义的。

二、重点:索引在MySQL中的数据结构

1、数据结构分析

哈希表:

  • 用哈希表查询元素,时间复杂度为O(1),查找效率极高。但是它在MySQL数据库中有个致命缺陷:它只能比较是否相等,不能进行大于小于这样的范围查询,而数据库经常需要范围查询。

二叉搜索树(BST=>Binary Search Tree):

  • 二叉搜索树,又叫二叉排序树。时间复杂度最坏为O(N)(节点个数就是树的高度时最坏)。在二叉搜索树平衡时,即是平衡二叉树(AVL=>AVL是由三个人创建的,取自他们的名字),才是O(logn)(注意:logn是非常高效的,n越大,logn函数图像越平,就越接近O(1))
  • 二叉搜索树可以范围查询,在数据库中可以满足哈希表的缺陷,即实现范围查询(找到起始点和终点就行)。但是二叉搜索树因为是二叉而不是n叉,所以树的高度会比较高,即使它变成平衡的AVL树,而树的高度就代表了查询元素需要的比较次数,在数据库比较元素时,是需要读写硬盘进行IO操作的,所以高度越高,查询效率越低

N叉搜索树(B树=>Binary Tree):

  • 又叫B树(B-Tree),有些人又叫B-树,不是B减树,而是叫做B杠树。例如B+树其实是B±树(B加杠树),因为不美观,所以省掉杠叫做B+树。而B树可以加上杠就是(B-树)。
  • 虽然比较次数不变,但是硬盘IO操作减少了。因为从硬盘读取一个节点时,每个节点里面就包含了多个数据,所以减少了硬盘IO操作。下面就是B树的数据结构简图。
    在这里插入图片描述

B+树:

  • 和B树一样,高度降低后,硬盘读写次数减少,效率提高
  • 适合范围查询。 因为B+树的数据都在叶子节点上,并且叶子节点用链表串起来,只要找到起点和终点所在的节点,用链表查询就很方便,所以非常适合范围查询。
  • 查询操作比较均衡。 因为所有数据都在叶子节点上用链表连接起来 ,无论查询哪个元素,硬盘IO次数差不多都要到叶子节点。而如果是B树,因为在非叶子节点上的数据也要看,所以对于查询一个数据可能IO次数减少,但查询一个范围的数据时,IO次数会大大增加。
  • 因为B+树的非叶子节点不存放数据行,只存放索引,因此空间大大降低,这时,内存可能就可以放下这个结构,进一步降低了硬盘的IO,提高效率。
  • 综上所有分析,B+树是非常适合于做数据库的索引背后的数据结构的。
    在这里插入图片描述

2、索引中的数据结构总结

  1. 主键索引会随着表的创建而自动创建(如果用B+树实现),当手动创建非主键索引时会再创建一棵B+树,这棵B+的非叶子节点里面存的都是这一列的key(比如创建name2索引 ),到了叶子节点这一行,存的就不是数据行了,而是存主键(id)。
  2. 如果使用主键列来索引来查询,只查一次第一棵B+树即可; 而如果用非主键列来查询,要先查一遍这个非主键列索引的B+树,然后再查主键列索引的B+树。
  3. 回表:就是用非主键列索引在叶子节点查出主键id,在根据id去主键列索引查询数据行。
  4. MySQL的InnoDB这个主流的数据库引擎,就是使用的B+树。不同的引擎可能使用不同的数据结构。哈希表增删查改效率极高,因此在特定情况下也可能使用哈希表。

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

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

相关文章

计算存储分离在京东云消息中间件JCQ上的应用

作者:田寄远 JCQ 全名 JD Cloud Message Queue,是京东云自研、具有 CloudNative 特性的分布式消息中间件。 JCQ 设计初衷即为适应云特性的消息中间件;具有高可用、数据可靠性、副本物理隔离、服务自治、健康状态汇报、少运维或无运维、容器部…

LeetCode代码随想录算法训练营第十一天-C++队列的应用

_11LeetCode代码随想录算法训练营第十一天-C队列的应用 239.滑动窗口最大值347.前K个高频元素 239.滑动窗口最大值 整体思路 要实现一个单调递减队列: 对于滑动窗口的滑动,移除前面的元素,加入后面的元素。当移除前面的元素时&#xff0…

彻底弄清SpringSecurity登录原理及开发步骤

SpringBootVue之SpringSecurity登录与授权(一) 工具:idea2018,springboot 2.1.4,springsecurity 5.1.5 简介 SpringSecurity是Spring下的一个安全框架,与shiro 类似,一般用于用户认证(Authentication)和用户授权(Autho…

【案例教程】MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧

【查看原文】基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧 随着生物多样性全球大会的举办,不论是管理机构及科研单位、高校都在积极准备,根据国家林草局最新工作指示,我国将积极整合、优化自…

ruoyi导入数据,第二次导入相同文件时,覆盖原数据;

考勤记录表——在导入时——应该做判断——避免重复导入成功报错 1.现在是,可以多次成功导入同一个文档,导致数据展示出错 期望: 导入文件时,如果这个文件名内数据select值不为0,那么覆盖表数据(update&…

vue组件库搭建报错问题(vue-loader报错、gulp打包css报错,包含组件库打包文件webpack及gulp)

1、vue-loader报错 报错详情 vue-loader 17.0.0运行webpack打包命令时会报错: 解决方法: 需适配版本:将package.json,vue-loader版本修改为 “vue-loader”: “^15.10.0”,删除本地node_modules文件夹,重…

这让人眼前一亮的MySQL14个小玩意

前言 我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。 1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中…

整个网页设置为全灰

前段时间,不是全网变灰色了嘛,整个网页的按钮、文本框、图片、文字等等都变成了灰蒙蒙的了,这是怎么做到的呢? 案例如下: 我就随便写个普通的html网页吧,在网页里随便写点文字和随便放几张图片(大概意思下…

TensorFlow安装与配置教程(2022.12)

1. TensorFlow的安装 首先需要安装 Anaconda 环境,可以转至:Anaconda3安装与配置教程(2022.11)。 然后我们打开 Anaconda,创建一个 TensorFlow 环境: conda create -n TensorFlow python3.9进入 TensorF…

API接口相关设计及基础知识

接口开发 API接口是什么 接口:预先定义的函数逻辑,供其他系统请求,然后返回结果 为什么需要API接口 核心需求:利用现有接口降低开发成本,缩短开发时间 API接口的核心是什么 接口地址请求参数(报文&am…

OPEN ALLIANCE TC2和TC9线束以太网测试标准?何种设备可以满足测试?除了矢量网分之外

OPEN ALLIANCE TC2和TC9线束以太网测试标准? 联盟中TC2汽车线束以太网线束定义标准: 100BASE-T1 Ethernet Channel & Components 100BASE-T1 offers a way to introduce modern signal processing in automotive, which allows optimal usage of th…

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

1. Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer&l…

JVM简单介绍

JVMJVM内存区域划分JVM类加载机制JVM垃圾回收机制【哪些内存需要被JVM中垃圾回收机制回收】【JVM中垃圾回收机制的基本单位】【JVM中垃圾回收机制是如何判断对象是否是垃圾】【如何回收垃圾】JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软…

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

2023年数字信号处理前沿国际会议(CFDSP 2023)

2023年数字信号处理前沿国际会议&#xff08;CFDSP 2023&#xff09; 重要信息 会议网址&#xff1a;www.cfdsp.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周内 收录检索&am…

【OpenCV】SURF图像拼接和Stitcher拼接

介绍两种图像拼接的方法&#xff0c;一种是SURF算法的图像拼接&#xff0c;另一种是Stitcher硬拼接 首先先从简单的讲起 一、Stitcher直接拼接 可以实现多张图片一起拼接&#xff0c;只要两行代码就可以实现拼接&#xff1b; 1.首先准备多张图片&#xff0c;放入向量容器中…

PDF如何插入空白页?3 次点击在PDF中插入空白页!

由于工作和学习的需要&#xff0c;您可能需要在现有的PDF文件中插入一张空白页或几页PDF&#xff0c;使之成为一个完整的PDF文件。但是&#xff0c;PDF文件实际上是最终作品&#xff0c;似乎不可能向其添加额外的页面。事实上&#xff0c;将空白页或 PDF 文件插入现有 PDF 文件…

Conv2Former ~2

还是来说Conv2Former~~ 上次发了一次~~ 一种卷积调制模块&#xff0c;利用卷积来建立关系&#xff0c;这比注意力机制在处理高分辨率图像时更高效&#xff0c;称为 Conv2Former。作者在 ImageNet 分类、目标检测和语义分割方面的实验也表明&#xff0c;Conv2Former 比以前基于…