计算机十万个为什么--数据库索引

作者:无限大6日期:2025/12/8

计算机十万个为什么--数据库索引

大家好,欢迎来到最新一期的无限大博客。

突然发现自己对数据库相关的内容掌握不够扎实,于是就去学习了一下,顺便也将自己的理解写成了一篇博客。

希望这篇文章能对大家有所帮助

数据库索引:给数据仓库装个"智能导航系统" 🧭

想象一下,你走进一个占地 1000 平方米的超级图书馆 📚,里面塞满了几十万本书,却连个分类牌都没有。老板忽然喊你找一本《数据库从入门到放弃》,你是不是当场想表演一个原地消失术?😱

这就是没有索引的数据库的日常!每次查询都像蒙眼找书,全表扫描就是那个被蒙住眼睛的倒霉蛋,只能一本本摸过去。而今天我们要聊的 数据库索引 ,就是给这个混乱图书馆装上的智能导航系统 🧭,让你秒变图书馆馆长,想找哪本书就找哪本书!

为什么"like '%关键词%'"会让索引当场罢工?

先看个灵魂拷问:下面两条 SQL,性能可能差 1000 倍!你猜哪个快?

1-- 语句 A
2SELECT * FROM books WHERE title LIKE '数据库%';
3
4-- 语句 B
5SELECT * FROM books WHERE title LIKE '%数据库%';
6

答案是语句 A 可能快到飞起,语句 B 可能慢到想砸键盘

原因就藏在那个小小的百分号里。

🌰 蒙眼找书现场还原

假设我们给 title 字段建了索引,就像图书馆按书名首字母排序的分类架。当你执行 LIKE '数据库%' 时,索引会开心地带你直奔 "数" 字区,从 "数据库入门" 找到 "数据库原理",一气呵成 🚀。

但如果写成 LIKE '%数据库%',相当于你告诉图书管理员:"我要找所有书名里包含'数据库'的书,但我不告诉你它在开头还是结尾"。这时候索引直接懵了 😵,因为它的排序规则是按首字母来的,现在关键词可能出现在任何位置,就像让你在所有书里找 "包含'的'字的书" 一样——索引完全帮不上忙!

全表扫描警告 ⚠️:数据库只能开启"蒙眼摸书"模式,逐行检查每条记录。如果表中有 100 万条数据,就像让你在 100 万本书里一本本翻开找,画面太美我不敢看 🥶。

image.png

避坑指南:3 个让索引失效的经典操作

错误写法 🔴正确姿势 🟢性能差距
LIKE '%关键词%'LIKE '关键词%' 或使用全文索引可能差 100~1000 倍
WHERE age + 1 = 25WHERE age = 24索引直接失效
WHERE SUBSTR(title, 3) = '数据库'WHERE title LIKE '__数据库%'函数操作导致索引失效

B+树索引 vs 哈希索引:新华字典 vs 快递柜

现在你决定给图书馆装导航系统了,但市场上有两种方案:

  • 方案 A :像《新华字典》那样的目录 📖(B+树索引)
  • 方案 B :像快递柜那样的编号系统 📦(哈希索引)

到底选哪个?这得看你平时怎么找书!

📖 B+树索引:新华字典的智慧

翻开你的新华字典,会发现它有两种目录:拼音索引和部首索引。B+树索引就像拼音索引,它把数据按顺序排好,并且只在叶子节点存储完整数据,中间节点都是"指路牌"。

1graph TD
2    A[根节点] -->|1-100| B[中间节点]
3    A -->|101-200| C[中间节点]
4    
5    B -->|1-50| D[叶子节点: 1,3,5...50]
6    B -->|51-100| E[叶子节点: 51,53...100]
7    
8    C -->|101-150| F[叶子节点: 101...150]
9    C -->|151-200| G[叶子节点: 151...200]
10    
11    D -->|链表指针| E
12    E -->|链表指针| F
13    F -->|链表指针| G
14

image.png 适用场景

  • 范围查询(比如找 "价格在 10-50 元的书")📊
  • 排序操作(比如 "按出版日期倒序排列")🔄
  • 前缀匹配(比如 LIKE '数据库%')🎯

📦 哈希索引:快递柜的暴力美学

哈希索引就像快递柜,每个 key 都通过哈希函数计算出一个唯一编号,直接定位到存储位置。比如查询 id=100 的数据,哈希函数算出来是 8 号柜,直接拉开 8 号柜就能找到!

适用场景

  • 等值查询(比如 WHERE id=100)⚡
  • 键值对数据库(如 Redis)🚀

image.png

灵魂对比表格 👇

特性B+树索引哈希索引
查找速度O(log n) 稳定O(1) 但有哈希冲突风险
范围查询✅ 天生支持❌ 完全不支持
排序✅ 叶子节点链表天然有序❌ 无序存储
内存占用中等(可存磁盘)较高(通常内存存储)
经典应用MySQL InnoDB 主键索引Redis、Memcached 键值存储

MySQL InnoDB 聚簇索引:叶子节点里藏着大秘密!

如果你用 MySQL 的 InnoDB 引擎,那你必须知道这个惊天大秘密 💣:

它的主键索引叶子节点直接存着整行数据!就像你查新华字典时,翻到 "数" 字不仅能看到拼音,还能直接把整页字典撕下来带走 📄。

聚簇索引 vs 非聚簇索引:冰箱 vs 储物柜

  • 聚簇索引 (主键索引):就像家里的冰箱 🧊,门(索引)打开直接看到食物(数据),不用再跑一趟。
  • 非聚簇索引 (二级索引):就像储物柜的标签 🏷️,上面写着"零食在冰箱第三层",你还得再去冰箱拿。
1graph TD
2    subgraph 聚簇索引 B+树
3        A[根节点: 主键范围 1-1000]
4        B[中间节点: 1-500]
5        C[中间节点: 501-1000]
6        D[叶子节点: 1-100, 包含整行数据]
7        E[叶子节点: 101-200, 包含整行数据]
8    end
9    A --> B
10    A --> C
11    B --> D
12    B --> E
13    D --> E --> F[...更多叶子节点]
14

image.png

实战:如何检测索引失效?

给大家分享一个我压箱底的索引失效检测 SQL 🕵️‍♂️,执行它就能知道查询有没有用到索引:

1EXPLAIN
2SELECT * FROM books
3WHERE title LIKE '%数据库%'  -- 这个会失效
4  AND price > 50;           -- 这个可能有效
5

结果解读 👇: -- 重点看 type 列: -- ✅ ref/range/index:索引有用 -- ❌ ALL:全表扫描,索引失效!

避坑神技 ✨:如果必须用 %关键词% 模糊查询,可以考虑用 全文索引

1-- 创建全文索引
2CREATE FULLTEXT INDEX idx_title_ft ON books(title);
3
4-- 高效查询包含关键词的记录
5SELECT * FROM books
6WHERE MATCH(title) AGAINST('数据库' IN NATURAL LANGUAGE MODE);
7

索引设计的三大灵魂拷问

  1. 是不是索引越多越好?

答:NO!索引像图书馆的分类架,太多了反而难找,而且每次增删改数据都要维护索引,就像每次新书入库都要重新贴标签 贴到崩溃。

  1. 主键为什么最好是自增 ID?

答:InnoDB 聚簇索引如果用随机 ID,会导致叶子节点频繁分裂,就像你整理好的书架忽然插进新书,整个架子都要重排 🗄️。

  1. 为什么不建议用 UUID 做主键?

答:UUID 是随机字符串,索引树会变成"歪脖子树" 🌳,查询效率暴跌!不信你试试给图书馆的书按 UUID 排序?


结语:索引不是银弹,但没有索引是真的完蛋

最后送大家一句我奶奶都能听懂的话:索引就像给自行车装变速器 🚲,平时通勤(简单查询)可能感觉不到,但遇到爬坡(复杂查询)时,有没有变速器直接是两个物种!

但记住,没有万能的索引设计,最好的实践是:用 EXPLAIN 分析 SQL,用监控工具观察慢查询,让数据告诉你答案 📊。

祝大家都能写出飞一般的 SQL,再也不用对着全表扫描掉头发!💇‍♂️💨

(如果觉得有用,记得点赞收藏哦~ 👇)


计算机十万个为什么--数据库索引》 是转载文章,点击查看原文


相关推荐


失业7个月,我把公司开起来了:一个程序媛的“野蛮生长”
后端小肥肠2025/11/28

大家好,我是小肥肠。 4月被裁,11月注册公司。 这7个月,我一个人赚回了以前一年的工资,也攒够了人生第一台CC的首付。今天不讲技术,聊聊这半年一个程序媛的野蛮生长。 1. 半年了我开起了公司 从4月到现在已经创业半年多了(7个月),这7个月以来,我从一个一无所有的失业人到现在攒够了一台cc的首付(赚的比以前上班一年还多),我的共学社群实现了从0到现在的300多人。 其中有很多和我一样的程序员,他们都是被我的文章吸引来共学群一起成长,也有很多小白进来一步一步成长为可以自行搭建自己的智能体。 在这


为什么说 AI 赋能前端开发,已经不是选择题,而是必然趋势?
西陵2025/12/16

首发于公众号 code进化论,欢迎关注。 前言 这几年 AI 在前端开发里的能力几乎是肉眼可见地进化”。从最早只能帮我们做做代码补全、提示几个参数,例如早期的 comate。到后来能够独立生成一个完整的 React/Vue 组件,连逻辑、样式和交互都能自动写好,例如 cursor 和 claude。再到现在,AI 已经能根据一句自然语言去搭建整个前端项目,自动创建页面、路由、接口层,甚至跑通基础业务流程,例如 v0 和 bolt.new。AI 的角色正在从“聪明的编辑器”变成“能独立干活的虚拟工


一文带你吃透 Java 反射机制
BestAns2025/12/24

一文带你吃透 Java 反射机制 在Java开发中,“反射”绝对是个让人又爱又恨的知识点。有人觉得它晦涩难懂、破坏封装,也有人靠它实现了各种灵活的功能——比如框架开发、动态配置加载。 其实反射没那么神秘,今天就给大家用最通俗的语言讲清楚:反射到底是什么、怎么用,以及反射在实际开发中的应用。 一、Java反射到底是什么? 我们先从Java的核心特性“封装”说起。平时写代码时,我们通过new关键字创建对象,调用类的方法、访问属性,都是在“编译期”就确定好要操作的类,比如User user = new


2025年终总结,智启
袁庭新2026/1/3

大家好,我是袁庭新。2025年就这么溜走了,对我而言,是极为不寻常的一年,总是想着用文字把它记录下来。 文章输出 写是为了更好的思考,坚持写作,力争更好的思考。 2025年累计发表54篇原创文章,平均1周更1篇,大多数是技术相关。2025年我有个转变——每个月写一篇月总结,对这个月主要做了什么事做一个系统的梳理,尽量以可量化的形式呈现,比如,这个月写了多少篇文章,拍了几条短视频,录了几节课,办了几场讲座等诸如此类。 为什么采用这种方式呢?前些年我也不是没写过年终总结,年底一回顾,感觉又稀里糊涂过


WPF样式进阶实战:外置样式+MVVM主题切换+样式优先级全解析
bugcome_com2026/1/11

在WPF开发中,样式(Style)是实现界面美化、统一风格、提高代码复用性的核心利器。但很多开发者在实际项目中,容易陷入「内联样式冗余」「主题切换困难」「样式优先级混乱」的困境,写出难以维护的XAML代码。 今天我们就通过一个完整的模块化实战项目(附全部可运行代码),从「外置样式封装」到「MVVM模式主题切换」,再到「样式优先级核心知识点」,全方位解锁WPF样式的高级用法,最终实现一个支持「浅/深色全局主题切换」「按钮专属样式切换」「传统后台代码样式切换」的完整案例。 一、项目架构梳理:模块化让


万字长文!搞懂机器学习中的概率图模型
aicoting2026/1/19

推荐直接网站在线阅读:aicoting.cn 概率图模型(Probabilistic Graphical Models, PGM)是一类结合概率论与图论的强大工具,用于描述多个随机变量之间的依赖关系。它通过图结构将复杂的联合概率分布分解为局部条件概率分布,使得对高维数据建模和推断变得可行且高效。 根据图的类型,PGM 可分为有向图模型(如贝叶斯网络)和无向图模型(如马尔可夫随机场)。贝叶斯网络利用有向无环图表示变量之间的因果关系,适合建模因果推断和序列数据;马尔可夫随机场则通过无向图捕捉变量之


耗时 20 天,AI 漫剧 APP 和 Web 全部开源, 已斩获 764 星!
苍何2026/1/28

这是苍何的第 474 篇原创! 大家好,我是消失了一段时间的苍何。 1 月 5 号,我写了篇文章,并开源了 AI 漫剧 APP,获得了很多朋友的喜欢。 然后在 GitHub 上一共获得了 764 星和 181 fork,让我有些吃惊。 说实话,这个项目远超我们的预期,甚至连歪果哥都来给我们提 issue,希望支持双语。 甚至还有老板来咨询问我卖不卖这个 APP,我说,大哥,咱都开源了,自己去整吧,不用付费,哈哈哈。 这或许就是开源的魅力吧。 但我发现,APP 还是不大方便,评论区也不少求


提示词工程入门-03
一诺滚雪球2026/2/6

前言 "写个代码" "帮我写个快速排序函数,用 Python 实现,要求时间复杂度 O(n log n),添加详细注释" 同样是让 AI 写代码,为什么第一个指令得到的是模糊的回复,而第二个能得到精确满足需求的代码? 这就是提示词工程(Prompt Engineering)的魔力。 好的 Prompt = 好的输出。今天我们来学习如何写出让 AI "秒懂"的提示词。 1. 什么是提示词工程 提示词(Prompt):你给大模型的输入指令 提示词工程(Prompt Engineering):设计和


EasyExcel的使用
脸大是真的好~2026/2/15

需求1:能够导出1个Excel文件,能够导入一个Excel文件; 需求2:导出的文件,能实现第1行,第123列的合并单元格:也就是会写注册处理器;知道sheet和cell是什么; 需求3:能实现合并的单元格设置单元格宽高,背景颜色,内容居中,字体大小; 需求4:能控制从任意行开始写入,并让要输出的字段居中; 需求5:导出能实现从任意行开始读入; 导出Excel文件 <!-- EasyExcel 核心依赖 --> <dependency> <groupId>com.alibaba</gro


一个简单Demo彻底理解前后端怎么连的丨Figma + Supabase + Vercel
阿星AI工作室2026/2/23

哈喽,大家好! 我是阿星👋 很多小白编程学了三个月,全是AI做主UI,难以融入自己的设计理念。 甚至不了解前后端到底怎么连通的。 一旦代码出错了,可能和AI对话还要重新理解一遍概念。所以今天,我们通过一个简单的case,把一个完整前后端的核心链路全跑一遍👇🏻 让你能自己把控UI、把控数据库、把控前端、后端。 🗺️ 先看一眼全局流程 整件事分五步,每一步做完了才能进下一步: ① Figma 画页面 →  ② 定接口契约 →  ③ Supabase 建数据库→  ④ AI 帮你写连接代码

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客