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无索引、全表更快。

相关推荐
倔强的石头_7 分钟前
多环境配置治理:开发、测试、生产连接信息如何隔离
数据库
杨云龙UP10 分钟前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
stark张宇24 分钟前
从页、区、段到 B+Tree:InnoDB 表空间如何组织数据?
mysql
2501_9336707936 分钟前
2027 应用统计学秋招选岗指南:统计、SQL、业务指标如何对应岗位
数据库·sql
Alice-YUE1 小时前
向量数据库选型实战:Chroma/Qdrant/Milvus/PgVector 怎么选
数据库·milvus·向量数据库·chroma·rag·qdrant
invicinble1 小时前
python 编程语言 认识维度
开发语言·数据库·python
IT古董1 小时前
《FDE前沿部署工程师实战教程》29 - Enterprise AI Security:Agent安全体系设计
大数据·数据库·人工智能
OpenCSG1 小时前
行业观察 | 在宜昌看具身智能:开源社区被摆到了台前
数据库·开源
喆星时瑜1 小时前
RStudio 数据清洗案例教程
大数据·数据库
明月_清风2 小时前
DuckDB:一个正在改变数据分析方式的数据库
数据库·数据分析·ai编程