MySQL主要使用的几种索引算法
MySQL 索引算法详解
在 MySQL 中,索引是一种提高查询速度的数据结构。不同的索引算法适用于不同的查询场景,本文将详细介绍 MySQL 的几种主要索引算法。
1. B+Tree 索引(默认索引)
1.1 存储结构
B+Tree(B+ 树)是一种平衡多路搜索树,其特点是:
- 所有数据存储在叶子节点,内部节点仅存储索引值。
- 叶子节点之间通过双向链表相连,便于范围查询。
- 所有叶子节点在同一层,保持查询效率稳定。
1.2 适用存储引擎
- InnoDB(默认)
- MyISAM
1.3 优势
✅ 适用于 范围查询(BETWEEN、>、< 等)
✅ 适用于 ORDER BY 排序查询
✅ 叶子节点形成链表,支持 高效的顺序遍历
1.4 局限性
❌ 不适用于全文搜索(需要使用 Full-Text 索引)
❌ 插入/删除频繁时可能导致索引分裂
2. Hash 索引(适用于等值查询)
2.1 存储结构
- 通过 哈希函数 计算键值映射到哈希桶,快速定位数据。
- 适用于 键值对查询(key-value)。
2.2 适用存储引擎
- Memory(Heap)引擎
- InnoDB(Adaptive Hash Index,自动优化的哈希索引)
2.3 优势
✅ 适用于 等值查询(=),查询速度快(O(1) 时间复杂度)
✅ 哈希表查询不会随数据量增加而变慢
2.4 局限性
❌ 不支持范围查询(>、<、BETWEEN)
❌ 不支持 ORDER BY 排序
❌ 容易哈希冲突,影响查询效率
3. Full-Text(全文索引)
3.1 存储结构
- 倒排索引(Inverted Index),存储单词 -> 文档 ID 的映射。
- 适用于 全文搜索(如文章、评论、日志)。
3.2 适用存储引擎
- InnoDB
- MyISAM
3.3 优势
✅ 适用于 全文搜索(MATCH() AGAINST())
✅ 比 LIKE '%xx%' 查询快得多
3.4 局限性
❌ 不适用于小数据量(索引维护开销大)
❌ 不能完全替代搜索引擎(如 Elasticsearch)
4. R-Tree(空间索引)
4.1 存储结构
- R-Tree(多维索引结构),适用于存储和查询 地理坐标(点、矩形、多边形)。
4.2 适用存储引擎
- MyISAM
- InnoDB(MySQL 8.0 之后支持
SPATIAL索引)
4.3 优势
✅ 适用于 地理信息查询(如“某点附近的餐馆”)
✅ 适用于 空间范围查询(如“某个区域内的所有数据”)
4.4 局限性
❌ 仅 MyISAM 支持,InnoDB 仅在 MySQL 8.0+ 支持
❌ 适用场景较窄,一般用于 GIS 应用
5. Bitmap 索引(适用于低基数列)
5.1 存储结构
- 位图(Bitmap),用 0/1 位 记录某个值在不同数据行中的出现情况。
5.2 适用存储引擎
- MySQL 不直接支持(Oracle、PostgreSQL 支持)
5.3 优势
✅ 适用于 低基数列(如性别、状态、布尔值)
✅ 节省存储空间,查询时可用位运算加速
5.4 局限性
❌ 不适用于高基数列(如手机号、用户名)
❌ 不支持动态更新(更新代价大)
6. 索引算法对比总结
| 索引类型 | 适用存储引擎 | 适用查询场景 | 优势 | 局限性 |
|---|---|---|---|---|
| B+Tree(默认) | InnoDB、MyISAM | 范围查询、排序查询、主键/外键 | 适用于大多数场景 | 插入/删除频繁时可能导致索引分裂 |
| Hash 索引 | Memory、InnoDB(自适应) | 精确匹配(=) | 查询速度快(O(1)) | 不支持范围查询、排序、模糊查询 |
| Full-Text 索引 | InnoDB、MyISAM | 全文搜索 | 适用于大文本字段(如文章搜索) | 不能完全替代搜索引擎 |
| R-Tree(空间索引) | MyISAM、InnoDB(8.0+) | GIS 地理查询 | 适用于空间数据 | 仅适用于 MyISAM(8.0+ InnoDB 支持) |
| Bitmap 索引 | MySQL 不支持 | 低基数列(如性别) | 高效存储和查询 | 更新代价高,不适用于高基数列 |
7. 结论
- 默认使用 B+Tree 索引(适用大部分情况)。
- 等值查询用 Hash 索引,但 InnoDB 默认不支持(Adaptive Hash Index 除外)。
- 全文搜索用 Full-Text 索引,比
LIKE '%xx%'查询更快。 - GIS 查询用 R-Tree 索引(
SPATIAL索引)。 - 低基数字段(如性别)可以考虑 Bitmap 索引,但 MySQL 不支持。
选择合适的索引结构,可以极大提升 MySQL 查询性能!
相关文章:
MySQL主要使用的几种索引算法
MySQL 索引算法详解 在 MySQL 中,索引是一种提高查询速度的数据结构。不同的索引算法适用于不同的查询场景,本文将详细介绍 MySQL 的几种主要索引算法。 1. BTree 索引(默认索引) 1.1 存储结构 BTree(B 树ÿ…...
Linux生成自签证书【Nginx】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
网络安全 | 加密技术揭秘:保护数据隐私的核心
网络安全 | 加密技术揭秘:保护数据隐私的核心 一、前言二、对称加密技术2.1 原理2.2 优点2.3 缺点2.4 应用场景 三、非对称加密技术3.1 原理3.2 优点3.3 缺点3.4 应用场景 四、哈希函数4.1 原理4.2 优点4.3 缺点4.4 应用场景 五、数字签名5.1 原理5.2 优点5.3 缺点5…...
使用服务器部署DeepSeek-R1模型【详细版】
文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中,模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别,如何高效、稳定地将深度学习模型部署到…...
DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
Direct3D 11 总结 —— 4 绘制三角形_direct绘制三角形-CSDN博客 DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区 - X_Jun - 博客园 练习题 粗体字为自定义题目 尝试交换三角形第一个和第三个顶点的数据,屏幕将显示什么?为什么&…...
Continue 与 CodeGPT 插件 的对比分析
以下是 Continue 与 CodeGPT 插件 的对比分析,涵盖功能定位、适用场景和核心差异: 1. 功能定位 工具核心功能技术基础Continue专注于代码自动补全和上下文感知建议,支持多语言,强调低延迟和轻量级集成。基于本地模型或轻量级AI&a…...
第二次连接k8s平台注意事项
第二次重新打开集群平台 1.三台机子要在VMware打开 2.MobaBXterm连接Session 3.三个机子docker重启 systemctl restart docker4.主节点进行平台链接 docker pull kubeoperator/kubepi-server[rootnode1 home]# docker pull kubeoperator/kubepi-server [rootnode1 home]# # 运…...
Ruby Dir 类和方法详解
Ruby Dir 类和方法详解 引言 在Ruby编程语言中,Dir类是一个非常有用的工具,它允许我们与文件系统进行交互,如列出目录内容、检查文件是否存在等。Dir类提供了多种方法,使得文件系统的操作变得简单且高效。本文将详细介绍Ruby中的…...
Mybatis篇
1,什么是Mybatis ( 1 )Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...
三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z),提供下载链接
三维粒子滤波(Particle Filter)MATLAB例程,估计三维空间中匀速运动目标的位置(x, y, z) 文章目录 介绍功能运行结果代码介绍 本 MATLAB 代码实现了三维粒子滤波( P a r t i c l e F i l t e...
WebAssembly:前后端开发的未来利器
引言 在互联网的世界里,前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主,后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而,近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...
设计模式Python版 享元模式
文章目录 前言一、享元模式二、享元模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
深入理解 YUV Planar 和色度二次采样 —— 视频处理的核心技术
深入理解 YUV Planar 和色度二次采样 —— 视频处理的核心技术 在现代视频处理和编码中,YUV 颜色空间和**色度二次采样(Chroma Subsampling)**是两个非常重要的概念。它们的结合不仅能够显著减少视频数据量,还能在保持较高视觉质量的同时优化存储和传输效率。而 YUV Plana…...
从0开始,来看看怎么去linux排查Java程序故障
一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…...
【MySQL】centos 7 忘记数据库密码
vim /etc/my.cnf文件; 在[mysqld]后添加skip-grant-tables(登录时跳过权限检查) 重启MySQL服务:sudo systemctl restart mysqld 登录mysql,输入mysql –uroot –p;直接回车(Enter) 输…...
区块链项目孵化与包装设计:从概念到市场的全流程指南
区块链技术的快速发展催生了大量创新项目,但如何将一个区块链项目从概念孵化成市场认可的产品,是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度,为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…...
JavaScript基础入门(一):从零开始掌握网页互动与动态效果
JS基础(一) 目的:html是骨架,css是血和肉,js 就是灵魂 知识点一:JavaScript基本使用 网页的三剑客分别是:HTML、CSS、JS,我们把HTML当做毛坯房,CSS是房子的装修&#…...
20240824 美团 笔试
文章目录 1、单选题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:硬件开发工程师(嵌入式系统软件开发方向) 题型:20 道单选题,2 道编程题题 1、单选题 1.1 C 语言中,如果输入整数 v 是 2 的幂,下面表达式中哪个会返…...
css-根据不同后端返回值返回渲染不同的div样式以及公共组件设定
1.动态绑定 Vue: 使用计算属性 getClassName 来动态计算样式类名,并通过 :class 绑定到 div 元素上。 <template><div :class"getClassName">这是一个根据后端值动态设置样式的 div 元素。</div> </template><script> exp…...
【数据科学】一个强大的金融数据接口库:AKShare
文章目录 1. AKShare 简介2. 安装 AKShare3. AKShare 核心功能3.1 获取股票数据3.2 获取股票实时数据3.3 获取基金数据3.4 获取期货数据3.5 获取外汇数据3.6 获取数字货币数据 4. 数据处理与存储5. 实战案例6. 总结 AKShare 是一个开源的金融数据接口库,它提供了简单…...
Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群
Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群 简介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系统安装部署 Kubernetes v1.29.13 集群 1 环境准备1.1 集群IP规划1.2 初始化步骤(各个节点都需执行)1.2.1 主机名与IP地址解析1.…...
如何开发一个大语言模型,开发流程及需要的专业知识
开发大型语言模型(LLM)是一个复杂且资源密集的过程,涉及多个阶段和跨学科知识。以下是详细的开发流程和所需专业知识指南: 一、开发流程 1. 需求分析与规划 目标定义:明确模型用途(如对话、翻译、代码生成…...
10. 神经网络(二.多层神经网络模型)
多层神经网络(Multi-Layer Neural Network),也称为深度神经网络(Deep Neural Network, DNN),是机器学习中一种重要的模型,能够通过多层次的非线性变换解决复杂的分类、回归和模式识别问题。以下…...
Windows 中学习Docker环境准备3、在Ubuntu中安装Docker
Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料,请文末联系 步骤 1:更新系统并安装依赖…...
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的智能学习平台管理系(含源码+数据库+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的智能学习平台管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、…...
把bootstrap5.3.3整合到wordpress主题中的方法
以下是将 Bootstrap 5.3.3 整合到 WordPress 主题中的方法: 下载 Bootstrap 文件:从 Bootstrap 官网下载最新的 5.3.3 版本的 CSS 和 JavaScript 文件。 上传文件到主题目录:将下载的 CSS 文件上传到 WordPress 主题文件夹中的 /css 文件夹…...
【Gitlab】虚拟机硬盘文件丢失,通过xx-flat.vmdk恢复方法
前言 由于近期过年回家,为了用电安全直接手动关闭了所有的电源,导致年后回来商上电开机后exsi上的虚拟机出现了问题。显示我的gitlab虚拟机异常。 恢复 开机之后虚拟机异常,通过磁盘浏览发现gitlab服务器下面的虚拟机磁盘文件只有一个xxx-f…...
GC日志的解读
GC日志的解读 gc日志的解读 gc日志的解读...
Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...
结构体排序 C++ 蓝桥杯
成绩排序 #include<iostream> #include<algorithm> using namespace std; struct stu {string name;//名字int grade;//成绩 }; stu a[30]; bool cmp(stu l, stu r) {if (l.grade ! r.grade) return l.grade > r.grade;return l.name < r.name; } int main()…...
