MySQL的索引原理(图解)
数据库的索引原理
0.什么是索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度,但是会降低写入速度。
- show index from table_name; 查看索引
- create index 索引名字 on 表(字段); 创建辅助索引
- drop index 索引名字 on 表(字段); 删除索引
1.索引类型
1.0.全文索引(FULLTEXT)
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
1.1普通索引
辅助索引
1.2. 唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
1.3. 主键索引
聚集索引
1.4. 单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
1.5. 组合索引(最左前缀)
联合索引
2.数据库索引原理
- B树结构(blance tree) 根--节点--分支--叶
-
B+树
#b+树 在b树的基础上进行了改良 - -1. 分支节点和根节点都不再存储实际的数据了,让分支和根节点能存储更多的索引的信息,就降低了树的高度, 所有的实际数据都存储在叶子节点中 -2. 在叶子节点之间加入了双向的链式结构(双向链表)方便在查询中的范围条件 -3. mysql中,所有的b+树索引的高度基本控制在3层
第一层存 1-10000的地址,10001-20000的地址,20001-30001的地址。。
第二层存 1-1000,1001-2000...90001-100001地址。。
第三层存 1,msg,jjj; 2,msg,kkkk;...并且第三层是一个双向链表,大大缩减了查询次数
-
b+树的高度会影响索引的效率,树的高度影响因素
- 1.选择尽量短的列做索引;每一个节点的存储的信息越多,树的高度也就越低,效率也就越快;
- 2.对区分度高的列做索引,重复率超过10%不适合;
-
聚集索引
- 在innodb中,聚集索引和辅助索引并存,在myisam中,只有辅助索引; 聚集索引:数据直接存储在树结构的叶子
- 主键创建的索引是聚集索引 其他键创建的索引都是辅助索引
-
辅助索引
- 数据不存在树中
- 叶子节点中存的主键,再通过一次或者多次查到数据;
-
辅助索引和聚集索引的配合使用(回表)
- 回表:通过辅助索引查到主键之后,去查聚集索引,就叫回表;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类