Mysql 索引概述
索引(index)是帮助Mysql高效获取数据的数据结构
索引优点:1. 提高排序效率 2. 提高查询效率
索引缺点:1.索引占用空间(可忽略)2.索引降低了更新表的速度,如进行insert,update,delette 时效率降低(也可忽略,因为实际很少用,大部分还是select)
我们平常所说的索引,如果没有特别指明,都是B+树结构组织的索引
B+树
1.所有的数据都会出现在叶子结点
2.叶子结点形成一个单向链表
键值是不存储数据的,数据存储在叶子结点上
非叶子节点:仅存储索引值(键) ,不存储实际数据。
叶子节点:存储索引值和实际数据 。
查找过程
- 定位叶子节点:从根节点开始,根据待查找的键值与非叶子节点中键值的比较结果,选择对应的子节点指针向下层查找 ,不断重复这个过程,直到找到叶子节点 。
- 在叶子节点查找:在叶子节点中,由于叶子节点存储了数据或指向数据的指针,所以可以在叶子节点中找到目标数据 。如果是范围查询,比如查找某个区间内的用户记录,找到区间起始值对应的叶子节点后,通过叶子节点间的双向链表顺序遍历,就能获取该区间内的所有数据 。
哈希索引
优点
- 等值查询速度极快:在理想状况下(不发生哈希冲突),哈希索引的查找时间复杂度为 O (1) ,能在常数时间内直接定位目标记录。比如在用户表中,查找用户 ID 为特定值的记录时,使用哈希索引可迅速找到对应数据,比一些树形索引结构(如 B - 树、B + 树 )更高效 。这是因为哈希索引通过哈希函数直接计算出存储位置,无需像树结构那样逐层查找 。
- 适合精确匹配场景:特别适用于精确匹配查询,像查找特定订单号、某个具体的商品编号等场景 。只要给出准确的键值,就能快速定位到对应的数据行 。
- 实现相对简单:相比一些复杂的树形索引结构(如 B + 树 ),哈希索引的原理和实现方式较为简单 。其主要依赖哈希函数和哈希表来组织和查找数据 。
- 缓存场景应用佳:由于查找速度快,在高频率的缓存场景中表现出色 。例如在缓存系统中,使用哈希索引能快速判断缓存中是否存在目标数据,提升缓存的读写率 。
缺点
- 不支持范围查询:哈希算法无法维护数据的排序关系,所以哈希索引仅适用于等值查询,不支持范围查询(如 <、>、BETWEEN 等操作 ) 。
- 存在哈希冲突问题:哈希函数可能将多个不同的键值映射到相同的位置,即产生哈希冲突 。解决哈希冲突通常采用链表法(将冲突的键值存储在链表中 )、开放地址法等 。但即便如此,哈希冲突仍可能导致性能下降,比如使用链表法解决冲突时,若链表过长,查询效率会受到影响 。
- 无法支持排序操作:因为哈希索引没有维护元素的顺序,所以无法直接支持 ORDER BY 或 GROUP BY 操作 。如果需要对数据进行排序或分组,必须在查询后对结果集进行额外处理 。
- 内存开销较大:通常需要较大的内存来存储哈希表,尤其是数据量较大时,内存占用会更加显著 。这限制了它在一些内存资源有限环境中的应用 。
- 存储引擎支持有限:在 MySQL 中,只有 MEMORY 存储引擎直接支持哈希索引 ,InnoDB 和 MyISAM 等常用存储引擎不直接支持 。虽然 InnoDB 提供了自适应哈希索引(在某些条件下自动创建 ),但并非完全等同于手动创建的哈希索引 。
为什么InnoDB引擎选择使用B+tree索引结构?
1.相对于二叉树来说层级更少,搜索效率高
2.B-tree 不管是叶子结点还是非叶子结点,都会存储数据,这样导致一页中存储的键值减少,指针跟着减少,在相同数据量的情况下占用了更多的空间。
3.相对于Hash索引,B+tree支持范围匹配及排序操作
索引分类
分类 | 含义 | 特点 | 关键字 |
---|---|---|---|
主键索引 | 针对于表中主键创建的索引 | 默认自动创建,只能有一个 | PRIMARY |
唯一索引 | 避免同一个表中某数据列中的值重复 | 可以有多个 | UNIQUE |
常规索引 | 快速定位特定数据 | 可以有多个 | 无 |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | FULLTEXT |
在 InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:
分类 | 含义 | 特点 |
---|---|---|
聚集索引 (Clustered Index) | 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据 | 必须有,而且只有一个 |
二级索引 (Secondary Index) | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引。
- 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
- 如果表没有主键,或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索引。
看这条语句的查询过程 select * from user where name='Arm';
先在二级索引里 Arm与Lee与比 ,A在L之前,去前面找,找到Arm之后获得存储的数据10,然后10再去聚集索引中来比较,找到10这个索引所储存的数据
每一个节点最终落在磁盘上就会存放在一个页当中,一个页的大小是固定的16k,那么一个页存储的数据就是有限的
非叶子结点能存放多少key和指针,非叶子结点不存放数据,只存放key和指针,并且指针永远比key多一个
一行数据大小为 1k,一页中可以存储 16 行这样的数据。InnoDB 的指针占用 6 个字节的空间,主键即使为 bigint,占用字节数为 8,n代表当前结点存储的key的数量。
n*8+(n+1)*6=16*1024 解得:n=1170
所以一个结点能存储1170个key,有1171个指针,每一个指针指向下面的一个子结点,一个子结点能存储16行数据,如果树的高度为2,那么能存储的数据量就是1171*16=18736
如果树的高度为3 ,则能存储的数据量就是1171*1171*16=21,939,856
相关文章:

Mysql 索引概述
索引(index)是帮助Mysql高效获取数据的数据结构 索引优点:1. 提高排序效率 2. 提高查询效率 索引缺点:1.索引占用空间(可忽略)2.索引降低了更新表的速度,如进行insert,update,delette 时效率降…...
HttpServletRequest常用功能简介-笔记
javax.servlet.http.HttpServletRequest 是 ServletRequest 接口的子接口,专用于处理 HTTP 协议相关的请求。它提供了访问请求行、请求头、请求参数以及请求属性等方法。 1.请求行(Request Line) ✅ 功能说明 请求行包含客户端发送的 HTTP …...

解决RAGFlow部署中镜像源拉取的问题
报错提示 Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded 解决方法 这个原因是因为拉取镜像源失败,可以在/etc/docker/daemon.json文件中添加镜像加速器,例如下面所示 {"registry…...

uniapp打包H5,输入网址空白情况
由于客户预算有限,最近写了两个uniapp打包成H5的案例,总结下面注意事项 1. 发行–网站-PCWeb或手机H5按钮,输入名称,网址 点击【发行】,生成文件 把这个给后端,就可以了 为什么空白呢 最重要一点…...
wsl2中Ubuntu22.04配置静态IP地址
第一步找到/etc/netplan目录下的01-netcfg.yaml文件,(如果不存在则自己创建一个)在里面配置一下代码: network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses: [192.168.3.222/24]routes:- to: 0.0.0.0/0via: …...

C++(21):fstream的读取和写入
目录 1 ios::out 2 ios::in和is_open 3 put()方法 4 get()方法 4.1 读取单个字符 4.2 读取多个字符 4.3 设置终结符 5 getline() 1 ios::out 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除…...

NAT/代理服务器/内网穿透
目录 一 NAT技术 二 内网穿透/内网打洞 三 代理服务器 一 NAT技术 跨网络传输的时候,私网不能直接访问公网,就引入了NAT能讲私网转换为公网进行访问,主要解决IPv4(2^32)地址不足的问题。 1. NAT原理 当某个内网想访问公网,就必…...

Unity 多时间源Timer定时器实战分享:健壮性、高效性、多线程安全与稳定性能全面解析
简介 Timer 是一个 Unity 环境下高效、灵活的定时任务调度系统,支持以下功能: •支持多种时间源(游戏时间 / 非缩放时间 / 真实时间) •支持一次性延迟执行和重复执行 •提供 ID、回调、目标对象等多种查询和销毁方式 •内建…...
深入解析Spring Boot与Spring Security的集成实践
深入解析Spring Boot与Spring Security的集成实践 引言 Spring Security是Spring生态中用于处理认证和授权的强大框架。在Spring Boot项目中集成Spring Security可以轻松实现用户认证、权限控制等功能。本文将详细介绍如何从零开始集成Spring Security,并解决实际…...

【iOS】探索消息流程
探索消息流程 Runtime介绍OC三大核心动态特性动态类型动态绑定动态语言 方法的本质代码转换objc_msgSendSELIMPMethod 父类方法在子类中的实现 消息查找流程开始查找快速查找流程慢速查找流程二分查找方法列表父类缓存查找 动态方法解析动态方法决议实例方法类方法优化 消息转发…...
用户账号及权限管理:企业安全的基石与艺术
在当今数字化时代,用户账号及权限管理已成为企业IT安全体系中不可或缺的核心组件。它不仅是保护敏感数据的第一道防线,更是确保业务运营效率和合规性的关键。本文将深入探讨用户账号及权限管理的重要性、最佳实践以及实施策略,助您构建一个安全、高效且灵活的访问控制体系。…...

413 Payload Too Large 问题定位
源头 一般是服务器或者nginx 配置导致的 nginx http {client_max_body_size 50m; # 调整为所需大小(如 50MB)# 其他配置... }nginx 不配置,默认是1M 服务器 spring 不配置也是有默认值的好像也是1M 如果出现413 可以试着修改配置来避…...

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…...

Ubuntu16.04升级gcc/g++版本方法
0 前言 gcc与g分别是GNU的c和c编译器,Ubuntu16.04默认的gcc和g的版本是5.4.0,在使用一些交叉编译工具链会提示找不到GLIBC_2.27,而GLIBC_2.27又需要gcc 6.2以上版本,因此本文介绍Ubuntu16.04升级gcc/g版本的方法。 1 Ubuntu16.0…...

微信小程序van-dialog确认验证失败时阻止对话框的关闭
使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close: wxml: <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…...
边缘计算模块
本文来源 :腾讯元宝 边缘计算模块是一种部署在网络边缘(靠近数据源)的集成化硬件/软件设备,用于实时处理本地数据,减少云端依赖,提升响应速度与安全性。以下是其核心要点: 1. 核心组成 …...
【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
【极兔快递Java社招】一面复盘|数据库线程池AQS中间件面面俱到 📍面试公司:极兔快递 👜面试岗位:Java后端开发工程师 🕐面试时长:约 60 分钟 🔄面试轮次:第 1 轮技术面&…...

OceanBase 的系统变量、配置项和用户变量有何差异
在继续阅读本文之前,大家不妨先思考一下,数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊,那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…...
Git本地使用小Tips
要将本地仓库 d:\test 的更新推送到另一个本地仓库 e:\test,可以使用 Git 的远程仓库功能。以下是具体步骤: 在 e:\test 中添加 d:\test 作为远程仓库 在 e:\test 目录中打开 Git Bash 或命令行,执行以下命令: git remo…...

【Python】Jupyter指定具体路径
一、右键Jupyter Notebook 右击Jupyter Notebook点击属性 二、修改以下两个地方...
ThreadLocal作一个缓存工具类
1、工具类 import java.util.HashMap; import java.util.Map;public class ThreadLocalUtil {// 使用Map存储多类型数据private static final ThreadLocal<Map<String, Object>> CONTEXT_HOLDER new ThreadLocal<>();// 存储数据public static void set(Str…...

RNope:结合 RoPE 和 NoPE 的长文本建模架构
TL;DR 2025 年 Cohere 提出的一种高效且强大的长上下文建模架构——RNope-SWA。通过系统分析注意力模式、位置编码机制与训练策略,该架构不仅在长上下文任务上取得了当前最优的表现,还在短上下文任务和训练/推理效率方面实现了良好平衡。 Paper name …...

virtualbox虚拟机中的ubuntu 20.04.6安装新的linux内核5.4.293 | 并增加一个系统调用 | 证书问题如何解决
参考文章:linux添加系统调用【简单易懂】【含32位系统】【含64位系统】_64位 32位 系统调用-CSDN博客 安装新内核 1. 在火狐下载你需要的版本的linux内核压缩包 这里我因为在windows上面下载过,配置过共享文件夹,所以直接复制粘贴通过共享文…...

unity UGUI虚线框shader
Shader "Custom/DottedLineShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",COLOR) (1,1,1,1)_LineLength("虚线长度",float) 0.08}SubShader{Tags //设置支持UGUI{ "Queue""Tran…...
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
vue2 打包生成text文件 和 前端项目的版本号json文件 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息生成版本号json文件-自动记录当前版本号、打包时间等信息新建branch-version-webpack-plugin.js文件 // 同步子进程 const execSyn…...

chirpstack v4版本 全流程部署[ubuntu+docker]
背景介绍 由于chirpstackv3 版本使用的是锐米提供的版本,从网络上寻找的资源大多数都是一样的v3版本,是经过别人编译好发布出来的,原本的chirpsatck项目是运行的linxu环境下的,因此我的想法是在linux服务器上部署chirpsatckv4,暂时使用linux上的chirpstack v4版本,目前编译成e…...
DeepSeek 赋能数字孪生:重构虚实共生的智能未来图景
目录 一、数字孪生技术概述1.1 数字孪生的概念1.2 技术原理剖析1.3 应用领域与价值 二、DeepSeek 技术解读2.1 DeepSeek 的技术亮点2.2 与其他模型的对比优势 三、DeepSeek 赋能数字孪生3.1 高精度建模助力3.2 实时数据处理与分析3.3 智能分析与预测 四、实际案例解析4.1 垃圾焚…...
每日一道leetcode(增加版)
901. 股票价格跨度 - 力扣(LeetCode) 题目 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今…...

数字信号处理-大实验1.1
MATLAB仿真实验目录 验证实验:常见离散信号产生和实现验证实验:离散系统的时域分析应用实验:语音信号的基音周期(频率)测定 目录 一、常见离散信号产生和实现 1.1 实验目的 1.2 实验要求与内容 1.3 实验…...
Java大厂求职面试:探讨Spring Boot与微服务架构
场景:互联网大厂Java求职者面试 面试官:张老师 程序员:谢飞机 第一轮提问:音视频场景 张老师:我们公司正在开发一个实时音视频聊天应用。请你谈谈如何使用Spring Boot和WebSocket实现实时通信? 谢飞机&…...