MySQL 索引

1. 核心概念

  • 索引是什么 :帮助MySQL高效获取数据的有序数据结构。

  • 核心作用 :提高查询速度 ,降低排序成本。

  • 代价 :占用额外空间,降低增、删、改的效率。


2. 核心数据结构:B+Tree

  • 默认索引结构:InnoDB存储引擎默认使用B+Tree。

  • B+Tree的核心特点:

    1. 所有数据都在叶子节点,非叶子节点只存索引(指针),不存数据。

    2. 叶子节点之间通过双向链表连接,便于范围查询。

  • 为什么选B+Tree,而不是其他?

    • 对比二叉树/红黑树:层级更少,IO次数更少。

    • 对比B-Tree:非叶子节点不存数据,能存放更多索引项,树更矮。

    • 对比Hash索引 :B+Tree支持范围查询 和排序。


3. 两种最重要的索引类型

索引类型 叶子节点存储内容 特点
聚集索引 (主键索引) 整行数据 一个表只有一个,一般是主键
二级索引 (非主键索引) 主键的值 可以有多个,查询可能需要回表
  • 回表 :通过二级索引找到主键ID,再到聚集索引查询完整数据的过程。尽量用覆盖索引避免回表。

4. 索引语法

4.1 创建索引

复制代码
-- 普通索引
CREATE INDEX index_name ON table_name (column1, column2...);
​
-- 唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column);
​
-- 全文索引
CREATE FULLTEXT INDEX index_name ON table_name (column);

4.2 查看索引

复制代码
SHOW INDEX FROM table_name;

4.3 删除索引

复制代码
DROP INDEX index_name ON table_name;

5. 核心使用原则

5.1 最左前缀法则 (联合索引)

  • 规则 :查询条件必须从联合索引的最左列开始 ,并且不跳过中间的列,否则索引部分或全部失效。

  • 关键点 :执行时字段的书写顺序不影响 ,但字段必须存在。

5.2 索引失效的几种常见情况

  1. 在索引列上进行运算或使用函数。

  2. 字符串类型字段不加引号(发生隐式类型转换)。

  3. 模糊查询时,通配符 % 在开头 (例如 LIKE '%关键词')。

  4. 使用 OR 连接的条件 ,如果 OR 前后的字段并非都有索引。

  5. MySQL评估认为全表扫描比使用索引更快(例如查询结果是大批量数据)。

5.3 覆盖索引

  • 概念 :需要查询的所有列 ,都包含在同一个索引中。

  • 优势 :查询数据可直接从索引中获取,无需回表,极大提升性能。

  • 实践 :尽量只查询必要的字段,避免使用 SELECT *。


6. 索引设计最佳实践

推荐做的事 (DO) 不建议做的事 (DON'T)
高频查询 、排序 、分组的字段上建索引 在频繁增删改的字段上建过多索引
选择区分度高的列(如手机号、身份证号) 在低区分度的列上建索引(如性别、状态)
使用联合索引,并遵循最左前缀法则 只为每个查询条件单独建单列索引
字符串长字段使用前缀索引 在很长的字符串上建完整索引
尽量使用覆盖索引 ,避免 SELECT * 查询返回超过表中大部分数据,索引反而慢

7. 执行计划 (EXPLAIN)

字段 重点关注项 说明
type ref、range、index、ALL 性能从好到差 。至少要达到 range 或 ref,避免 ALL (全表扫描)。
possible_keys 可能用到的索引 与 key 对比,看是否用了预期的索引。
key 实际使用的索引 如果为 NULL,说明没用到索引。
Extra Using index、Using where Using index 表示使用了覆盖索引 ,是好的;Using filesort、Using temporary 是坏现象。

8. 常用命令速查

操作 命令
创建普通索引 CREATE INDEX idx_name ON table_name(column);
创建唯一索引 CREATE UNIQUE INDEX idx_name ON table_name(column);
查看索引 SHOW INDEX FROM table_name;
删除索引 DROP INDEX idx_name ON table_name;
查看执行计划 EXPLAIN SELECT ...;

9. 核心速记口诀

  • B+Tree:数据全在叶子,非叶子只存指针,叶子连成链表。

  • 聚集索引:叶子挂数据,一个表一个。

  • 二级索引:叶子挂主键,查询可能回表。

  • 覆盖索引:索引包所有,查询不回表。

  • 最左前缀:联合索引从左起,跳过中间就失效。

  • 索引失效:运算、隐式转换、%在前、OR无索引、全表更快。

相关推荐
SelectDB3 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶3 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶5 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风5 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio6 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲9 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋10 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子11 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T12 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡12 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql