【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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echarts写某个市地图

const geoJSON {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":440303,"name":"罗湖区","center":[114.123885,22.555341],"…

照明灯具哪个品牌好,一文详细带你了解照明灯具种类有哪些

在孩子学习过程中,有一样物品的重要性不容忽视,那就是一盏提供舒适光源的照明灯具。那么照明灯具哪个品牌好?面对不断增加的学业负担,孩子们经常需要在夜晚借助台灯的光亮进行学习,这已经成为了家庭生活中普遍的情景。…

【全开源】多功能投票小程序源码(Uniapp+ThinkPHP+FastAdmin)

💥**【热门推荐】多功能投票小程序,一键解决你的选择难题!**💥 基于ThinkPHPFastAdminUniapp开发的多功能系统,支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、…

FullCalendar日历组件集成实战(15)

背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件&#xff0…

面向对象编程垃圾回收机制

系列文章目录 文章目录 系列文章目录前言一、垃圾回收机制(Garbage Collection) 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…

在AWS上运行的EKS Elastic Kubernetes Service 创建集群Cluster,Node group, Nodes

1. 前提条件 AWS Account: https://aws.amazon.com/free/Installing KubeCtl CLI https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.htmlEKS Cluster RoleIAM Role for Node GroupVPCEC2 Key Pair which can be used to SSH to the worker nodesAWS …

植物ATAC-seq文献集锦(三)——果实发育篇

ATAC-seq在植物研究领域的应用我们已经介绍2期了,本期我们聚焦ATAC-seq技术在果实发育方向的应用案例。 植物ATAC-seq文献集锦(一)——基因组篇 植物ATAC-seq文献集锦(二)——生长发育篇 文献一:Ident…

论文阅读笔记:Cross-Image Relational Knowledge Distillation for Semantic Segmentation

论文阅读笔记:Cross-Image Relational Knowledge Distillation for Semantic Segmentation 1 背景2 创新点3 方法4 模块4.1 预备知识4.2 跨图像关系知识蒸馏4.3 Memory-based像素到像素蒸馏4.4 Memory-based像素到区域蒸馏4.5 整体框架 5 效果 论文:http…

Visual Studio Code远程linux计算云

一、前置条件 本机安装Visual Studio Code 打开Vscode时建议使用管理员权限打开,在这之前遇到了一些报错。 二、开始远程连接计算云 安装插件remote-ssh 2.点击远程资源管理器,之后在SSH这行的右侧,点击“”号,去新建远程 3.在窗…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(二)

第三节 GB/T19001-2016 标准正文 本节为ISO9001:2015 标准条款的正文内容,各条款中的术语参照上节内容理解时,会很轻松。本节不再一一对各条款讲解。 引 言 0.1 总 则 采用质量管理体系是组织的一项战略决策,能够帮助其提高整体绩效…

进程的创建和管理

一. 实验内容 1. 编写一个程序,程序中创建一个子进程。然后父、子进程各自独立运行,父进程不断地在标准输出设备(即显示器)上输出字母p和回车(输出30次或以上),子进程不断地在标准输…

iOS 18 中全新 SwiftData 重装升级,其中一个功能保证你们“爱不释手”

概览 在最新的 WWDC 2024 中,苹果对多个系统框架都做了重量级的功能升级。这怎么能够少了 SwiftData 这位“后起之秀”呢? 万象更新的 iOS 18 为 SwiftData 增加了全新的唯一性、自定义数据仓库、富表达式以及字段索引等超赞功能。 在本篇博文中&#…

植物大战僵尸杂交版 v2.0.88 mac版 Plants vs. Zombies 杂交版下载

特别注意:该游戏最低系统要求为macOS Sonoma 14.X,低于此系统版本的请勿下载! 游戏介绍 植物大战僵尸杂交版是由B站UP主“潜艇伟伟迷”制作的一款结合了《植物大战僵尸》原有元素与创新玩法的游戏。这款游戏以其独特的“杂交”植物概念在B站…

提醒:网站使用微软雅黑字体的三种方式,两种侵权,一种不侵权。

大家都知道微软雅黑是windows系统的默认字体,但是不知道微软雅黑的版权归属方正字体,而且方正字体仅仅授权了微软在windows系统中使用该字体,脱离了windows使用,那是极易中招的,网页字体使用是前端开发的工作之一&…

H5拟态个人主页

文末有该项目的源码~ 这张图片的效果你是不是非常想要get同款&#xff1f; 源码就是这个样子 这段HTML代码构建了一个个人主页&#xff0c;结合了CSS样式和JavaScript功能。 下面是对代码的主要组成部分的详细解释&#xff1a; 基本结构 <!DOCTYPE html> 定义文档类型…

进来学习Kubernetes知识点

Kubernetes集群部署 文章目录 Kubernetes集群部署一、Kubernetes概述1.1、什么是Kubernetes1.2、为什么要用Kubernetes 二、Kubernetes组件2.1、Master组件2.2、Node组件 三、Kubernetes资源对象3.1、Pod3.2、Label3.3、Replication Controller3.4、Deployment3.5、Service3.6、…

数据库第一次实验报告

1. 使用 SQL 语句创建数据库 studentsdb。 2. 使用 SQL 语句选择 studentsdb 为当前使用数据库。 3. 使用 SQL 语句在 studentsdb 数据库创建数据表 student_info、curriculum、grade 4. 使用 SQL 语句 INSERT 向 studentsdb 数据库的 student_info、curriculum、grade 表插…

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

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

java:自定义注解,并使用【ImportBeanDefinitionRegistrar】动态加载

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等等。。。 https://download.csdn.net/download/chenhz2284/89432848 # 主项目 【pom.xml】 <groupId>com.chz</groupId> <artifactId>chzopen_study</artifactId> <packaging>pom…

嵌入式操作系统_4.任务管理

1.任务的概念 任务管理是嵌入式操作系统最基本功能之一&#xff0c;这里的任务&#xff08;task&#xff09;是指嵌入式操作系统调度的最小单位&#xff0c;类似于一般操作系统进程或线程的概念。任务是运行中的一个程序&#xff0c;一个程序加载到内存后就变成任务&#xff1…