【MySQL】索引(上)

https://www.wolai.com/curry00/fzTPy3kSsMDEgEcdvo4G5w
https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=69
https://jimhackking.github.io/%E8%BF%90%E7%BB%B4/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%B4%A2%E5%BC%95

索引是一种用于快速查询和检索数据的数据结构,排序好的数据结构。
优点:加快检索速度;通过创建唯一性索引,可以保证行数据的唯一性;通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点:创建和维护索引需要耗费时间,本身存储也要耗费一定空间

mysql索引类型

  • 按「数据结构」分类:B+tree索引、Hash索引、Full-text全文索引(是一种通过建立倒排索引,快速匹配文档的方式)、R-tree空间索引(空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少)。
  • 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)
    • 二级索引(Secondary Index)就是非聚簇索引,是因为二级索引的叶子节点 存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。
    • 主键索引就是聚簇索引,叶子节点存储就是数据
  • 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引
    注意主键索引不允许为null,不允许相同,唯一索引允许多个null但不能相同,普通索引允许为null也允许相同,前缀索引只适用于字符串类型的数据,前缀索引是对文本的前几个字符创建索引。
  • 按「字段个数」分类:单列索引、联合索引
    建立在单列上的索引称为单列索引,比如主键索引;
    建立在多列上的索引称为联合索引;
    在这里插入图片描述

不同引擎对索引的支持情况
在这里插入图片描述

索引数据结构

哈希表、有序数组、B+树、B树、红黑树,二叉树

  • 哈希表:只适用于等值查询的场景,用这种索引做不了范围查询,必须全表扫描。查询效率高

  • 有序数组:有序数组在等值查询和范围查询场景中的性能就都非常优秀,但是一旦更新数据就得挪动后面的元素,成本太高

  • 二叉搜索树:为了维持 O(log(N)) 的查询复杂度,需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(log(N))。
    二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。你可以想象一下一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。

  • B树:在二分查找树的基础上,增加单个节点的数据存储数量,同时增加了树的子节点数,一次计算可以把查找范围缩小更多。
    插入节点过程:中间节点向上分裂,某个分支超过最大节点数了,最中间的节点,加入根节点中去 https://www.cs.usfca.edu/~galles/visualization/BTree.html(可视化演示网站)
    在这里插入图片描述
    在这里插入图片描述

    但是非叶子节点会存放索引数据和业务数据,为了查找对比计算,需要把数据加载到内存以及 CPU 高速缓存中时,都要把索引数据和无关的业务数据全部查出来。如果所对比的节点不是所查的数据,那么这些加载进内存的业务数据就毫无用处,全部抛弃。

  • B+ 树:为了拆分索引数据与业务数据的平衡多叉树。非叶子节点只保存索引数据,叶子节点保存索引数据与业务数据,叶子结点形成双向链表,所有元素都会出现在叶子节点。这样即保证了叶子节点的简约干净,数据量大大减小,又保证了最终能查到对应的业务数。既提高了单次 I/O 数据的有效性,又减少了 I/O 次数,还实现了业务。在这里插入图片描述

  • 红黑树:红黑树就是介于完全不平衡和完全平衡之间的一种二叉树,可以解决二叉树的这个问题(二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢,),通过每个节点有红黑两种颜色、从节点到任意叶子节点会经过相同数量的黑色节点等一系列规则,实现了树的层数最大也只会有两倍的差距,这样既能提高插入和删除的效率,又能让树相对平衡从而有还不错的查询效率。
    从整体上讲,红黑树就是一种中庸之道的二叉树,但是用来当mysql的索引还是有问题,用红黑树存放100万个数据,把树放满,这个树的高度会越变越高和二叉搜索树一样 在这里插入图片描述

1、B树和B+树的区别

  • B+树所有的数据都会出现在叶子节点,B+叶子节点有所有索引的冗余和其对应的数据,非叶子节点没有数据,B树没有冗余,非叶子节点有数据
  • B树检索的过程就相当于对于范围内的每个节点的关键字做二分查找,没到达叶子节点可能检索就结束了,检索B+树最后肯定会查询到底,效率比较稳定
  • B+树叶子节点之间相互之间也构成一个双向链表,B树没有。所以B树进行范围查询需要找到查询的下限,然后进行中序遍历。B+树直接对链表进行遍历就行

2、为什么mysql使用B+树?

  • B+树非叶子节点不放数据只放索引,所以可以存放更多的索引,比B树更矮胖,所以IO次数就比较少
  • B+树有很多冗余节点,所以插入、删除的效率就比较高,而B树删除插入调整很多
  • B+树叶子节点用双向链表相互连接了起来,所以范围查询效率比较高

3、MyISAM和InnoDB引擎中的B+树区别是什么?

  • MyISAM不管是不是主键索引,使用的都是非聚簇索引(叶子节点的data部分放数据记录的地址
  • InnoDB主键索引使用聚簇索引(叶子节点部分就是数据),二级索引则是非聚簇索引

聚簇索引和非聚簇索引

  • 聚簇索引:
    优点:查询速度快,对主键的排序查找和范围查找速度快
    缺点:依赖有序数据,更新代价比较大
  • 非聚簇索引:
    优点:更新代价小
    缺点:依赖有序的数据,可能会二次查询(回表)

1、什么是回表?
如果我用 product_no 二级索引查询商品,如下查询语句:

select * from product where product_no = '0002';

会先检二级索引中的 B+Tree 的索引值(商品编码,product_no),找到对应的叶子节点,然后获取主键值,然后再通过主键索引中的 B+Tree 树查询到对应的叶子节点,然后获取整行数据。这个过程叫「回表」,也就是说要查两个 B+Tree 才能查到数据

2、创建表时,InnoDB 存储引擎会怎么选择索引?

  • 如果有主键,默认会使用主键作为聚簇索引的索引键(key)
  • 如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key)
  • 在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引键(key)

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

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

相关文章

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(流程优化)

系列篇章💥 No.文章1AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获…

linux笔记8--安装软件

文章目录 1. PMS和软件安装的介绍2. 安装、更新、卸载安装更新ubuntu20.04更新镜像源: 卸载 3. 其他发行版4. 安装第三方软件5. 推荐 1. PMS和软件安装的介绍 PMS(package management system的简称):包管理系统 作用:方便用户进行软件安装(也…

【深度学习】解析Vision Transformer (ViT): 从基础到实现与训练

之前介绍: https://qq742971636.blog.csdn.net/article/details/132061304 文章目录 背景实现代码示例解释 训练数据准备模型定义训练和评估总结 Vision Transformer(ViT)是一种基于transformer架构的视觉模型,它最初是由谷歌研究…

blender bpy将顶点颜色转换为UV纹理vertex color to texture

一、关于环境 安装blender的bpy,不需要额外再安装blender软件。在python控制台中直接输入pip install bpy即可。 二、关于代码 本文所给出代码仅为参考,禁止转载和引用,仅供个人学习。 本文所给出的例子是https://download.csdn.net/downl…

BerkeleyDB练习

代码; #include <db.h> #include <stdio.h>int main() {DB *dbp;db_create(&dbp, NULL, 0);printf("Berkeley DB version: %s\n", db_version(NULL, NULL, NULL));dbp->close(dbp, 0);return 0; } 编译运行

4-异常-log4j配置日志滚动覆盖出现日志丢失问题

4-异常-log4j配置日志打印滚动覆盖出现日志丢失问题(附源码分析) 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&…

XGBoost预测及调参过程(+变量重要性)--血友病计数数据

所使用的数据是血友病数据&#xff0c;如有需要&#xff0c;可在主页资源处获取&#xff0c;数据信息如下&#xff1a; 读取数据及数据集区分 数据预处理及区分数据集代码如下&#xff08;详细预处理说明见上篇文章--随机森林&#xff09;&#xff1a; import pandas as pd im…

异常封装类统一后端响应的数据格式

异常封装类 如何统一后端响应的数据格式 1. 背景 后端作为数据的处理和响应&#xff0c;如何才能和前端配合好&#xff0c;能够高效的完成任务&#xff0c;其中一个比较重要的点就是后端返回的数据格式。 没有统一的响应格式&#xff1a; // 第一种&#xff1a; {"dat…

探索开源世界:2024年值得关注的热门开源项目推荐

文章目录 每日一句正能量前言GitCode成立背景如何使用GitCode如何把你现有的项目迁移至 GitCode&#xff1f;热门开源项目推荐actions-poetry - 管理 Python 依赖项的 GitLab CI/CD 工具项目概述技术分析应用场景特点项目地址 Spider - 网络爬虫框架项目简介技术分析应用场景项…

【RabbitMQ】异步消息及Rabbitmq安装

https://blog.csdn.net/weixin_73077810/article/details/133836287 https://www.bilibili.com/video/BV1mN4y1Z7t9/ 同步调用和异步调用 如果我们的业务需要实时得到服务提供方的响应&#xff0c;则应该选择同步通讯&#xff08;同步调用&#xff09;。 如果我们追求更高的效…

Jupyter Notebook简介

目录 1.概述 2.诞生背景 3.历史版本 4.安装 5.卸载 6.如何使用 7.菜单和菜单项 8.示例 9.未来展望 10.总结 1.概述 Jupyter Notebook是一种基于Web的交互式计算环境&#xff0c;主要用于数据分析、数据科学、机器学习以及探索性编程等领域。允许用户在单个文档中编写…

批量文本编辑神器:一键拆分每行内容,高效实现批量处理与保存,让文本编辑更高效快捷!

在信息化快速发展的今天&#xff0c;文本编辑已经成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;面对大量的文本内容&#xff0c;如何高效地进行编辑和处理&#xff0c;成为了许多人面临的难题。今天&#xff0c;我要向大家介绍一款批量文本编辑神器&#xff0…

【C#】图形图像编程

实验目标和要求&#xff1a; 掌握C#图形绘制基本概念&#xff1b;掌握C#字体处理&#xff1b;能进行C#图形图像综合设计。 运行效果如下所示&#xff1a; 1.功能说明与核心代码 使用panel为画板&#xff0c;完成以下设计内容&#xff1a; 使用pen绘制基础图形&#xff1b;使…

【MYSQL】MYSQL操作库

1.数据库字符编码集/数据库校验集 当我们在数据库中保存数据时&#xff0c;需要存和取时候编码一致&#xff0c;比方说你用汉语保存的数据&#xff0c;当你读的时候为了避免乱码问题&#xff0c;也必须用汉语读&#xff0c;这就叫做数据库字符编码集一致。 当我们进行查找&…

C语言的结构体与联合体

引言 C语言提供了结构体和联合体两种聚合数据类型&#xff0c;使得程序员可以创建包括多个数据类型的复杂数据结构。结构体用于将不同类型的数据组合成一个单元&#xff0c;而联合体用于在同一存储空间中存储不同类型的数据。本篇文章将详细介绍C语言中的结构体和联合体&#x…

快消品经销商如何进行有效的团队激励?

很多经销商会面临员工工作不积极、吃大锅饭的现象&#xff0c;导致企业人力成本浪费严重&#xff0c;工作效率也得不到提升&#xff0c;因此经销商老板们必须进行一些绩效考核&#xff0c;然后开展一些有效的激励政策&#xff0c;这样通过提成激励来提高员工的积极性。 1、梳理…

探地雷达正演模拟,基于时域有限差分方法,四

突然发现第三章后半部分已经讲了使用接收记录成像的问题&#xff0c;所以这一章只讲解简单的数据分析。 &#xff08;均以宽角法数据为例子&#xff0c;剖面法数据处理方式都是相同的&#xff09;假设&#xff0c;我们现在已经获得了一个GPR记录&#xff0c;可以是常用的.sgy格…

有关排序的算法

目录 选择法排序 冒泡法排序 qsort排序&#xff08;快速排序&#xff09; qsort排序整型 qsort排序结构体类型 排序是我们日常生活中比较常见的问题&#xff0c;这里我们来说叨几个排序的算法。 比如有一个一维数组 arr[8] {2,5,3,1,7,6,4,8},我们想要把它排成升序&#…

StarNet实战:使用StarNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2403.19967 论文主要集中在介绍和分析一种新兴的学习范式——星操作&#xff08;Star Operation&#xff09;&#xff0c;这是一种通过元素级乘法融合不同子…

VS2022 使用C++访问 mariadb 数据库

首先,下载 MariaDB Connector/C++ 库 MariaDB Products & Tools Downloads | MariaDB 第二步,安装后 第三步,写代码 #include <iostream> #include <cstring> #include <memory> #include <windows.h>#include <mariadb/conncpp.hpp>…