当前位置: 首页 > news >正文

数据库索引简介

一、 核心比喻:书籍的目录

想象一下一本厚厚的、没有目录的百科全书。你想查找“光合作用”的相关内容,你只能从第一页开始,一页一页地翻,直到找到为止。这种方法就是全表扫描,效率极低。

数据库索引,就相当于这本书的目录

  • 目录(索引):它按照拼音或笔画(键值)排序,并告诉你内容在哪一页(物理地址)。

  • 你(数据库):想查“光合作用”,直接先查目录,找到对应的页码,然后快速翻到那一页。这个过程就是索引查询,效率极高。

结论:索引是一种帮助数据库高效获取数据的数据结构。


二、 索引的本质与工作原理

1. 本质是什么?

索引是一个独立于数据本身的、存储在磁盘上的数据结构。它包含着对数据表中一列或多列的值进行排序的指针,这些指针指向表中数据的实际存储位置。

2. 它是如何工作的?(以最常见的B+Tree为例)

大多数现代数据库(如MySQL的InnoDB)使用 B+Tree 作为默认的索引数据结构。

B+Tree的特点:

  • 多路平衡查找树:树形结构,矮胖,层级少。这意味着从根节点到叶子节点的查找路径非常短,通常只需要3-4次磁盘I/O就能在亿级数据中找到目标。

  • 所有数据都存储在叶子节点:内部节点(非叶子节点)只存储键值(索引列的值)和指针,不存储实际数据。这使得每个内部节点可以容纳更多的键,让树更“矮胖”。

  • 叶子节点之间有指针链接:叶子节点之间像链表一样连接起来。这对于范围查询(如 WHERE age > 20 AND age < 30)非常高效,只需要找到第一个满足条件的叶子节点,然后顺着指针遍历即可。

工作流程简化版:

  1. 数据库收到查询请求,例如 SELECT * FROM users WHERE id = 29;

  2. 发现 id 列上有索引,于是进入索引的 B+Tree 结构。

  3. 从根节点开始,根据键值(29)与节点内的键值比较,决定下一步走向哪个子节点(比如,走 20-40 这个分支)。

  4. 一路向下,最终到达叶子节点,在叶子节点中找到键值 29 以及它对应的数据行地址(或直接存储的数据)。

  5. 根据这个地址,快速定位到磁盘上的数据行,并将其返回。


三、 索引的优点与代价

优点:
  1. 大大加快数据的检索速度:这是最主要的原因,尤其是对大型表。

  2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性(如主键索引)。

  3. 加速表与表之间的连接:在进行 JOIN 操作时,如果连接条件上有索引,性能会显著提升。

  4. 在使用分组(GROUP BY)和排序(ORDER BY)子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

代价:
  1. 占用额外的磁盘空间:索引需要被存储,表越大,索引也越大。

  2. 降低数据增、删、改的速度:当对表中的数据进行增加、删除和修改操作时,数据库不仅需要更新数据本身,还需要更新对应的索引结构,以维持 B+Tree 的平衡和有序性。因此,索引不是越多越好。


四、 索引的类型

  1. 普通索引:最基本的索引,没有任何限制。

  2. 唯一索引:索引列的值必须是唯一的,但允许有空值。主键索引是一种特殊的唯一索引,不允许有空值。

  3. 主键索引:特殊的唯一索引,每个表只能有一个,不允许为空。

  4. 复合索引(联合索引):基于多个列创建的索引。例如 INDEX (last_name, first_name)。查询时遵循最左前缀原则,即查询条件必须包含联合索引的最左边的列,索引才会生效。例如,上面的索引对 WHERE last_name = ‘Smith’ 有效,但对 WHERE first_name = ‘John’ 无效。

  5. 全文索引:主要用于快速检索文本内容中的关键词,适用于搜索引擎场景。

  6. 哈希索引:基于哈希表实现,等值查询非常快(O(1)时间复杂度),但不支持范围查询,也不支持排序。


五、 何时创建索引?(最佳实践)

  • 主键自动创建唯一索引

  • 频繁作为查询条件的列(WHERE 子句中的列)。

  • 经常需要排序或分组的列(ORDER BY, GROUP BY 子句中的列)。

  • 作为外键的列,用于表连接。

  • 对于查询中很少涉及的列或重复值过多的列(如“性别”列,只有‘男’,‘女’两个值),创建索引意义不大,甚至可能降低性能。

  • 表数据量非常小(例如只有几千行)时,全表扫描可能更快,创建索引反而增加开销。

  • 写操作(INSERT/UPDATE/DELETE)非常频繁,而查询操作很少的表,不宜创建过多索引。

六、 小结

特性说明
是什么一种排好序的、快速查找的数据结构(如B+Tree)。
为什么用极大提高查询效率,避免全表扫描。
代价占用空间,降低增删改速度。
核心原则在“读”性能和“写”性能之间取得平衡。只为必要的列创建索引。

简单来说,索引是数据库的“加速器”。理解并正确使用索引,是进行数据库性能优化的最关键技能之一。

http://www.dtcms.com/a/411271.html

相关文章:

  • 基于三角测量拓扑聚合优化的LSTM深度学习网络模型(TTAO-LSTM)的一维时间序列预测算法matlab仿真
  • 关键词网站查询产品展示网站源码php
  • TOGAF ® 标准与循环经济:为可持续与责任型 IT 而设计
  • C盘内存不足,清除或转移VS2022缓存文件Cache
  • 玉米病叶识别数据集,可识别褐斑,玉米锈病,玉米黑粉病,霜霉病,灰叶斑点,叶枯病等,使用yolo,coco,voc对4924张照片进行标注
  • 修改Linux上的ssh的默认端口号——及其客户端使用ssh连接不上Linux问题排查解决
  • 连接世界:网络请求 `wx.request`
  • 安徽省建设厅网站打不开批量导文章到wordpress
  • 用一个OneKey MCP把付费的AI Agent MCP的价格打下来 - DeepNLP OneKey MCP Agent Router项目
  • 绿算技术与清智图灵完成产品兼容性互认证
  • 成都微信网站开发黄骅贴吧
  • Redis监控告警体系搭建:使用Redis Exporter + Prometheus + Grafana
  • 制作网站价格不一wordpress 英文月份
  • 深入解析 Redis 单线程 IO 模型:从架构到多路复用技术
  • 【mysql】数据误删了? 关键时刻可以通过binlog挽救
  • MySQL核心操作:从插入到查询全解析
  • gRPC从0到1系列【1】
  • 网站建设电影WordPress发表心情
  • php做网站的优势网站建设方案的所属行业是
  • java-stream流
  • spiffs分区文件系统在esp idf的创建
  • php网站开发技术描述南昌seo网站排名
  • html5微网站做网站原型图软件
  • 86-python电网可视化项目-6
  • 长乐住房和城乡建设局网站wordpress文章页面
  • 技术拐点将至:AI 大模型的挑战突围与产业重构
  • 青海省住房和城乡建设部网站关键词排名优化软件价格
  • 图片做多的网站是哪个邢台移动网站设计
  • TypeScript 中避免使用 @ts-ignore 的最佳方案
  • 数据传输一致性保障:如何避免‘少数据’或‘脏数据’?