MySQL(五)索引

一、索引的减I/O设计

1.读取量

2.搜索树

2.1方向

2.2有序

3.分多叉

3.1B树

弊端:

3.2B+树

3.2.1非叶子-搜索字段

3.2.1.1海量分叉

3.2.1.1.1最大式

3.2.1.1.2最快式

3.2.1.2缓存内存

3.2.1.2.1字段总量小

3.2.1.2.2时间复杂度

3.2.1.3区间搜索向下保留

3.2.1.3.1过程

3.2.1.3.2模式

3.2.1.3.3效果

3.2.2叶子-对应记录

3.2.2.1全集键值对

3.2.2.2链表物理连续

3.2.2.3开键稳定查询

二、索引的操作

1.查看

2.创建

2.1创建时机

2.2大表索引的创建

2.2.1直接创建过程

2.2.2危险性

2.2.3正确创建做法

3.删除


索引 是以字段为键记录为值B+搜索树

一、索引的减I/O设计

从硬盘搜索读取 查询记录时,由于 一次硬盘读取数据到内存的时间 是内存里操作数据时间的 10万倍,MySQL通过 索引 数据结构的设计 减少了查询记录的硬盘I/O的次数


1.读取量

保持着硬盘 单次最大读取量-页 最大量地进行读取 以减少读取I/O次数,每个B+搜索树节点的存储空间 是一个页,即对应每次读取完 一个B+搜索树节点的 总页存储空间的内容量


2.搜索树

2.1方向

在搜索树中,查询时 会避免遍历地 每次往 正确范围正向增长搜索到概率 的方向进行搜索 直到最后搜索到 也会精确匹配


2.2有序

搜索树结构 维护了 记录值 以字段键的有序性,支持 以字段的范围查询记录以字段的排序记录


对比哈希表: 

哈希表虽然能实现 一次硬盘读取 就可O(1)地查询到记录,但只能精确匹配,内部是 以哈希函数维护的 无序数组,无法范围查询,也无法进行排序


3.分多叉

在一次读取的一个节点中 放多个排布搜索对象 分多叉一次更多对象的排布完一次更多对象的搜索完一次搜索接往到 更加细致确定的 范围区间里来

3.1B树

键值对 单位存储

键值对 合空间 如果很,节点可以直接 大量存储键值对,每个节点 排布海量N个键值对 N+1次方地 向下分支排布搜索数据 来完成 海量键值对数据的 入树的排布

弊端:
  • 存储少-> 排布少-分支少-树高-I/O高

但在数据库中,一个值记录的空间很大,一个键字段的空间很小,键值对的合空间很大

一个节点一个页的存储量 放不了多几个键值对 排布分叉的,每个节点能存储下来的排布数据少 向下分支少 向下搜索的区间广 ,需要往下分支很多次 才可分布排完数据,树的高度会很高, 处在叶子节点的大部分键值对 要硬盘从顶层 多次读取搜索到底层 才可搜索到,硬盘I/O总体会很高


  • 记录在全节点-> 不稳定

作为查询搜索的结果的 键值对里的值记录,与键一块 直接存储在 出现的树节点中,少部分的 在非叶子节点的键值对 可以少量I/O地 往下读取搜索到,大部分的在叶子节点的键值对 需要大量I/O地读取到底层,查询的时间开销不稳定


3.2B+树

键与值 分开存储

B+树 针对数据库里 值记录空间很大,一个搜索树节点 无法存下过多个键值对 去海量分叉排布,将键与值分开存储键在非叶子节点搜索值在叶子节点对应

3.2.1非叶子-搜索字段
3.2.1.1海量分叉
3.2.1.1.1最大式

非叶子搜索阶段 每个非叶子节点 放无记录值对应海量键字段,一个节点一个页 就可最多放 多达1600个键字段地 大量排布搜索数据 细致划出排往范围 地搜索


3.2.1.1.2最快式

内存中 操作数据的速度虽然快,但一次从硬盘读取到内存的数据 如果处理的单位个数过多,一时间内 内存里也无法快速比较完 个数过多的数据,所以每个节点 放1000个键字段 以1000的次方 向下分支排布 存储搜索的数据,3层 对应3次硬盘读取 就可排查地搜索完 分支排布到亿级的 字段量


3.2.1.2缓存内存
3.2.1.2.1字段总量小

非叶子节点内的 亿级总记录个数的 字段量,由于字段的空间很小,能确保 所有全记录对应的 字段总空间 是很小的,况且缓存只对非叶子节点 并未对分支到最后一层的叶子节点 的记录里的 字段量进行缓存,所以非叶子节点里 也不会有 所有记录个数对应的 总字段量 那么多,非叶子节点字段总空间很小 可以缓存到内存中的


3.2.1.2.2时间复杂度

首次查询:

非叶子节点字段量 在首次查询时 B+搜索树高度次硬盘读取 从硬盘 把此搜索树的所有非叶子节点 全部读取加载到缓存中存放


后续查询:

在后续查询时,非叶子节点的字段数据 都已加载在缓存内存中有 不用再硬盘读取 直接继续在缓存中 对字段进行搜索 常数时间,然后搜索出指定叶子节点后 再对存储在硬盘的叶子节点键值对 硬盘读取一次 固定一次硬盘I/O的常数时间,时间复杂度也就成了O(1)


3.2.1.3区间搜索向下保留
3.2.1.3.1过程

非叶子节点的所有键字段 都开区间地隐藏 搜索不到,每次对它们搜索完 都作为查询的 可能的结果键 以子区间最大值的形式 往搜索子区间的N叉区域 分别向下传递


3.2.1.3.2模式

形成了非叶子节点的 只往区间搜索键键字段数据向下保留传递的 搜索模式


3.2.1.3.3效果

叶子节点整棵树所有出现过的 父节点区间键 与整棵树在叶子节点 最后剩余出的区间键 会构成整棵树的 从左往右有序的 键字段全集


3.2.2叶子-对应记录
3.2.2.1全集键值对

叶子节点层,键字段全集的叶子节点 对应存上值记录全集的键值对


3.2.2.2链表物理连续

叶子节点之间 再左右相连地 连接成链表 使搜索树逻辑上的有序 再套上了 物理相邻存储的有序大大优化了磁盘I/O

搜索树 范围查询数值时,避免了B树的 范围查询回溯节点的硬盘I/O时间开销,而每到下一个连续数值的链表节点 就对应一次硬盘I/O


3.2.2.3开键稳定查询

B+搜索树都是在叶子节点闭键,键在叶子节点时 才可以去搜索查询到的,查询 会在且只能在 叶子节点搜索查询到固定了查询的时间开销


二、索引的操作

1.查看

show index from tb_name;
show create table tb_name;

查看表中所有的索引

2.创建

create index idx_name on tb_name(col);

为表的指定列字段创建索引 ,primary keyuniqueforeign key字段 在创建表时 就会自动创建出索引维护


2.1创建时机

表创建数据空时 或在表的数据量较小时 就要将 要创建的索引创建好


2.2大表索引的创建

2.2.1直接创建过程

为一个记录量很大的表 创建指定字段的索引

第一层:

从创建的 第1个顶层根节点出发,每个节点里面 都有存储1000个字段

第二层:

第二层 为第一层根节点里面存储的1000个排布键 分出的1000个字段区域 往下为每个区域 分叉都创建一个 对分到的区域再次存储有1000个排布键的 排布划分的节点,因此第二层就共创建了1000个节点

第三层:

第三层 为第二层的1000个节点 每个节点 都会分叉1000个区域 每个区域 对应去创建存储有1000个排布值的 1个节点,第三层就会总共去创建1000*1000个节点

第四层:

再往下层就会去创建1000*1000*1000个节点

第N层:

1000的次方量 往下创建节点,直到叶子所有节点 总共存储的字段 覆盖字段全集时,该字段的B+搜索树 才创建好


2.2.2危险性

工作量巨大,会使服务器 一时间全盘去创建索引的B+搜索树 而呈挂机状态


2.2.3正确创建做法

如果就要为一个海量数据的表 创建索引,正确的做法是:

  1. 在另一个mysql服务器上 创建相同结构的空表 创建索引
  2. 再将数据 控制量地 可正常维护索引地 导入建树,B+搜索树创建好索引创建好后
  3. 最后对服务器更换转到使用 此索引创建好的 mysql服务器

3.删除

drop index idx_name on tb_name;

删除表中的指定索引

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

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

相关文章

GPT-5博士级AI使用教程及国内平替方案

GPT-5博士级AI使用教程及国内平替方案一、GPT-5核心升级:到底强在哪里?1. **统一入口自动思考模式**2. **256K上下文40万汉字记忆**3. **人格系统长期记忆**4. **编程能力史诗级增强**二、注册与访问:国内用户也能免费上车1.官方渠道&#xf…

云计算-多服务集群部署实战指南:从JumpServer到Kafka、ZooKeeper 集群部署实操流程

简介围绕企业级服务部署与集群搭建,基于 OpenStack 私有云平台,介绍了一系列关键服务的实操过程。内容涵盖使用 CentOS7 系统部署 JumpServer 堡垒机并对接 controller 与 compute 节点,构建 RabbitMQ 集群(含磁盘节点与内存节点配…

深入剖析Spring IOC容器——原理、源码与实践全解析

🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河; 🛠️ 每一个算法都是我绘制…

探秘C语言:数据在内存中的存储机制详解

探秘C语言:数据在内存中的存储机制详解探秘C语言:数据在内存中的存储机制详解一、二进制与进制转换:数据的不同"外衣"1.1基本概念1.2进制转换二、整数在内存中的存储:补码的奥秘原码、反码、补码总结探秘C语言&#xff…

HTML 常用标签介绍

目录 HTML 标签 HTML 常用标签速查表 文档元标签 页面结构与布局 文本内容与排版 链接与媒体 列表与表格 表单与交互 其他功能标签 文本结构标签 文本格式化标签 列表标签 链接与导航标签 媒体标签 容器与结构标签 表格标签 表单标签 元信息与文档标签 脚本…

kafka 冲突解决 kafka安装

目录 解法方法&#xff1a; 一般情况正常可以版本2.0.2 报错&#xff1a; File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen…

论文阅读 2025-8-9 [DiC, DropKey]

闲来没事&#xff0c;找点近一年的论文看看 1. DiC: Rethinking Conv3x3 Designs in Diffusion Models ✨ 一句话总结&#xff1a;DiC用沙漏架构稀疏跳跃条件门控重构纯Conv3x3扩散模型&#xff0c;在速度碾压Transformer的同时性能反超&#xff0c;为实时生成任务开辟新路径。…

16进制pcm数据转py波形脚本

将16bit的单声道或者双声道的16进制的pcm数据转成波形图片出来分析数据&#xff0c;python脚本如下&#xff1a;import numpy as np import matplotlib.pyplot as plt# 1: 单声道&#xff0c;2&#xff1a;双声道 PCM_CHANNELS 2# 你提供的十六进制数据 hex_str ""…

MySQL的锁:

目录 锁的介绍&#xff1a; 并发事务访问相同数据可以分为以下几种情况&#xff1a; 都是进行读操作&#xff1a; 都是进行写操作&#xff1a; 有读操作也有写操作&#xff1a; 读锁、写锁&#xff1a; 读锁&#xff1a; 写锁&#xff1a; 按照锁粒度分类&#xff1a;…

一道同分排名的SQL题

1 概述遇到这样一道题&#xff1a;(1) 有一张学生课程分数表&#xff0c;字段有&#xff1a;ID、名称、性别、科目、分数。&#xff08;名称换为学号更能标识唯一学生&#xff0c;但名称好阅读&#xff0c;故这里先认为名称可以唯一标识学生。&#xff09;(2) 用一个SQL&#x…

ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration

标题&#xff1a;Reverse Convolution and Its Applications to Image Restoration作者&#xff1a;Xuhong Huang, Shiqi Liu, Kai Zhang, Ying Tai, Jian Yang, Hui Zeng, Lei Zhang单位&#xff1a;Nanjing University, The Hong Kong Polytechnic University, OPPO Research…

mysql启动超时

mysql启动超时&#xff1a; 管理员打开CMD后允许net start MySQL57&#xff0c; 启动超时检查错误日志 MySQL 启动失败的具体原因通常记录在错误日志中。 日志路径&#xff08;根据你的安装方式可能不同&#xff09;&#xff1a; 默认位置&#xff1a;C:\ProgramData\MySQL\MyS…

Flink Stream API 源码走读 - window 和 sum

本文核心观点 核心观点&#xff1a;WindowedStream 是一个"假流"&#xff0c;它比 KeyedStream 更虚&#xff0c;只是一个 API 的过渡器&#xff0c;不是真正意义上的 DataStream&#xff0c;需要调用函数回归。 虚拟化时刻&#xff1a;从真实流到虚拟流 KeyedStream…

蓝牙 GFSK RX Core 架构解析

GFSK RX Core分为以下几个模块&#xff1a; 1.Frequency offset compensation CORDIC 2.A low pass filter 3.A power estimator for packet detection,RSSI and digital gaion computation for DPSK path 4.A demodulator implemented as Phase Shift Discriminator 5.A drequ…

微电网管控系统中python多线程缓存与SQLite多数据库文件连接池实践总结(含源码)

1. 引言 在分散的微电网能源管理场景中,系统采用集中式云平台模式,为100个独立微电网用户提供高并发数据写入服务面临三大挑战:用户数据隔离、I/O性能瓶颈、多线程安全性。本文揭示一种新式的分片锁+三级缓存+sqlite多数据库文件连接池架构,在保持SQLite轻量级优势的同时,…

InfluxDB 开发工具链:IDE 插件与调试技巧(一)

引言 ** 在当今数字化时代&#xff0c;时间序列数据的处理与分析在众多领域中都扮演着至关重要的角色。无论是物联网设备产生的海量传感器数据&#xff0c;还是金融市场中实时波动的交易数据&#xff0c;又或是服务器运维过程中不断产生的性能指标数据&#xff0c;这些都属于…

计算机网络-IPv6

1、IPv6基础IPv4与IPv6的对比&#xff1a;问题IPv4的缺陷IPv6的优势地址空间IPv4地址采用32比特标识&#xff0c;能提供的地址数量是43亿&#xff0c;分配很不均衡。针对IPv4的地址短缺问题&#xff0c;有几种解决方案&#xff1a;无类别域间路由CIDR&#xff08;Classless Int…

整体设计 之“凝聚式中心点”原型 --整除:智能合约和DBMS的深层融合 之2

摘要&#xff08;CSDN的AI助手自动生成的&#xff09;本文提出了一种基于"整除"数学原型的智能合约与DBMS融合架构设计&#xff0c;将SQL查询语句的四个关键段&#xff08;SELECT、FROM、WHERE、BY&#xff09;分别映射到整除运算的四个要素&#xff08;商、被除数、…

【赵渝强老师】TiDB表数据与键值对的映射关系

TiDB实例将表中的每一行数据映射成RocksDB中的键值对&#xff0c;则需要考虑如何构造Key和Value。首先&#xff0c;OLTP场景下有大量针对单行或者多行的增、删、改、查等操作&#xff0c;要求数据库具备快速读取一行数据的能力。因此&#xff0c;对应的Key最好有一个唯一ID&…

带操作系统的延时函数

delay.c:#include "delay.h"/*** brief 微秒级延时* param nus 延时时长&#xff0c;范围&#xff1a;0~233015* retval 无*/ void delay_us(uint32_t nus) {uint32_t ticks;uint32_t tcnt 0, told, tnow;uint32_t reload SysTick->LOAD; //重…