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

数据库学习(五)——MySQL索引

一、MySQL索引

MySQL 中的 索引(Index)提升查询效率的关键机制。索引在表中某些列上建立一个快速查找的数据结构,能够显著减少数据的扫描量,从而提升查询、排序、分组等操作的性能。

作用:

功能说明
提高查询效率加快 WHERE 条件过滤,减少全表扫描
加速排序与分组支持 ORDER BYGROUP BY 等操作
强制唯一约束PRIMARY KEYUNIQUE 索引可防止重复数据插入
加速关联查询联表查询时加快 JOIN 条件字段的匹配速度
提高部分更新效率支持 UPDATE/DELETE 时更快定位记录

二、MySQL 索引类型(逻辑分类)

索引类型说明
主键索引(PRIMARY)唯一且不能为空,每张表最多一个,InnoDB 中作为聚簇索引数据和索引在一起
唯一索引(UNIQUE)字段值必须唯一,但可为 NULL
普通索引(INDEX)最基本的索引类型,无唯一性约束
组合索引(Composite)多列组成的索引,支持“最左前缀原则”
全文索引(FULLTEXT)用于大文本匹配(如博客、文章搜索),支持 MATCH AGAINST 查询方式
空间索引(SPATIAL)支持几何数据类型,MyISAM/InnoDB 支持部分实现

三、MySQL 索引底层结构

类型底层结构应用场景特点
B+ 树索引B+ 树默认索引结构(InnoDB高效范围查询、按序遍历、主键聚簇、高页利用率
哈希索引哈希表MEMORY引擎默认索引仅适合等值查询,无法进行范围或排序查询
全文索引倒排索引MyISAM / InnoDB用于全文搜索(匹配文本中的单词)
R 树索引R-TreeMyISAM 的 GIS 空间索引支持多维空间数据(地理数据)查询

1. B+ 树索引(最常见

数据结构特性:

  • 多路平衡查找树,所有数据只存在叶子节点
  • 叶子节点按键值递增顺序通过双向链表连接,便于范围查询
  • 非叶子节点仅保存索引字段,不保存数据。

应用场景:

  • 主键索引(聚簇索引);
  • 二级索引(辅助索引);
  • 联合索引;
  • 最常用于 InnoDB 存储引擎中。

特点:

特点说明
支持排序、范围因为索引是有序的,可以高效地做 BETWEENORDER BY
树高较小一个节点可存上百个 key,通常只需 2~3 次磁盘 IO 查找
叶子节点数据结构聚簇索引存整行记录,辅助索引存主键值

2. 哈希索引(Hash Index)

数据结构特性:

  • 哈希函数计算键值对应的位置;
  • 适合 =IN 查询;
  • 无序,不支持范围查询 和 排序。

注意事项:

  • 常用于 MEMORY 引擎;
  • 哈希冲突会降低性能;
  • InnoDB 支持 自适应哈希索引(Adaptive Hash Index),由 B+ 树自动生成部分热点哈希。

3. 倒排索引(Inverted Index)

数据结构:

  • 类似搜索引擎,每个单词对应一个文档列表
  • 本质是 Hash + List

应用场景:

  • FULLTEXT 全文索引;
  • 支持 MATCH ... AGAINST 查询;
  • 适合大文本字段的关键词检索。

示例:

"mysql" → [doc1, doc4]
"index" → [doc2, doc5]

4. R 树索引(空间索引)

数据结构:

  • R-Tree多维空间数据的索引结构;
  • 用于二维或多维空间的矩形、坐标数据。

应用场景:

  • 地理信息系统(GIS);
  • MyISAM 引擎下的空间索引(InnoDB 从 5.7+ 支持);
  • 常配合 SPATIAL INDEX 使用。

四、最左前缀原则(组合索引的查询优化关键)

在 MySQL 的 B+ 树联合索引(联合主键或普通索引) 中,有一个非常重要的优化原则——最左前缀原则(Leftmost Prefix Rule)

定义:

最左前缀原则是指:在使用联合索引时,查询条件必须从最左边的列开始连续使用,索引才能被有效使用。

示例说明

假设有一个联合索引:

CREATE INDEX idx_user ON users (name, age, city);

这个索引的结构顺序是:(name, age, city)

可以使用索引的查询:

查询语句能否用索引原因
SELECT * FROM users WHERE name = 'Alice'使用了第一列 name
SELECT * FROM users WHERE name = 'Alice' AND age=30使用了前两列 (name, age)
SELECT * FROM users WHERE name = 'Alice' AND age=30 AND city='BJ'使用了全列,最优
SELECT * FROM users WHERE name LIKE 'A%'✅(前缀)使用了 name 前缀查询

无法使用索引的查询:

查询语句能否用索引原因
SELECT * FROM users WHERE age = 30没有使用最左的 name 字段
SELECT * FROM users WHERE city = 'BJ'跳过了前两个字段
SELECT * FROM users WHERE name = 'Alice' AND city='BJ'✅(部分)中间缺了 age,只使用了 name 的索引

原因:索引是按顺序构建

联合索引底层是 B+ 树,树结构是按照创建顺序建立的:

(name) → (name, age) → (name, age, city)

一旦中间字段缺失,MySQL 无法精准定位后续字段的范围

应用建议:

  1. 构建联合索引时,字段顺序很重要,要把过滤性强、常用作查询条件的列放前面
  2. 在写 SQL 时,尽量保证 WHERE 子句 从左到右连续使用索引列。
  3. 尽量避免跳列、只用尾列等情况,会导致索引失效。

五、常见的索引使用建议

建议原因说明
针对高频查询字段添加索引提升检索性能
WHEREJOINORDER BY 字段优先考虑索引能显著减少扫描量
控制单张表索引数量建议不超过 5~6 个索引越多,写入性能越差,维护开销越大
使用覆盖索引(索引包含所有查询字段)避免回表,进一步提升查询效率
避免在索引字段上使用函数或计算WHERE YEAR(birth)=1990 会导致索引失效
避免使用 %前缀通配LIKE '%abc' 无法使用索引;但 LIKE 'abc%' 可用

六、索引失效的常见原因

原因示例 SQL
索引列使用函数或计算WHERE YEAR(date_col) = 2020
隐式类型转换WHERE phone = 123456(列为 VARCHAR)
使用 OR部分列无索引WHERE a=1 OR b=2
LIKE 模糊匹配 %前缀WHERE name LIKE '%abc'
组合索引未遵循最左前缀原则WHERE age = 20(索引为 name, age)

七、索引相关操作

-- 创建普通索引
CREATE INDEX idx_name ON users(name);-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);-- 创建组合索引
CREATE INDEX idx_name_age ON users(name, age);-- 删除索引
DROP INDEX idx_name ON users;-- 查看表索引
SHOW INDEX FROM users;

八、使用工具分析索引效果

工具或命令功能
EXPLAIN SELECT ...查看是否使用索引、访问方式
SHOW INDEX FROM ...查看索引结构
pt-duplicate-key-checker查找重复或冗余索引
ANALYZE TABLE让优化器重新评估索引统计信息

九、索引的使用场景

场景是否应建索引
高频查询的字段(如用户ID、邮箱、手机号)
经常作为 JOIN 条件的字段
查询结果非常少(高选择性字段)
表中数据很少、几百条以内
写操作远多于读操作(如日志表)
经常更新的字段,且更新频率高慎用
http://www.xdnf.cn/news/1013653.html

相关文章:

  • 2025年ASOC SCI2区TOP,强化学习驱动双邻域结构人工蜂群算法RL_DNSABC,深度解析+性能实测
  • React Native 构建与打包发布(iOS + Android)
  • Java EE 导读
  • 从信息孤岛到智能星云:学习助手编织高校学习生活的全维度互联网络
  • “第三届全国技能大赛”倒计时100天—千眼狼高速摄像机为焊接与增材制造项目提供可视化评判依据
  • electron实现加载页(启动页)
  • 优秀的大语言模型
  • 物联网嵌入式硬件开发管理指南(超详细版):基于三种外包方式的三阶段策略
  • 【经验总结】ECU休眠后连续发送NM报文3S后ECU网络才被唤醒问题分析
  • Android13 新增 Stable AIDL接口
  • 猎板PCB:手机主板pcb需要做哪些可靠性测试
  • 笔记本电脑安装win10哪个版本好_笔记本装win10专业版图文教程
  • 智驱未来:迁移科技3D视觉系统重塑复合机器人产业生态
  • 【Create my OS】1 最小内核
  • 上传一个菜谱-最后部分(项目完结)
  • Python爬虫实战:研究WebSocket-for-Python相关技术
  • Java集合 - LinkedList底层源码解析
  • icg真的只能用latch不能用Flip-flop吗
  • FPGA多通道卷积加速器:从零构建手写识别的硬件引擎
  • 电脑虚拟网卡安装(添加以太网2)
  • 自己的电脑搭建外网访问网站服务器的步骤
  • 局域网内电脑与安卓设备低延迟同屏技术【100ms - 200ms】
  • Python-PLAXIS自动化建模技术与典型岩土工程
  • PyTorch深度学习框架60天进阶学习计划 - 第58天端到端对话系统(一):打造你的专属AI语音助手
  • 全时智能客服+精准触达转化:云徙科技打造汽车营销新体验
  • 【论文解读】OpenR:让大模型“深思熟虑”的开源框架
  • 51c自动驾驶~合集59
  • PCB 层压板的 Dk 和 Df 表征方法 – 第二部分
  • 高频面试之11Flink
  • 【Docker】docker 常用命令