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

相关推荐
袋鼠云数栈36 分钟前
让 SQL 解析不再重复造轮子:SqlParserX 正式开源
数据库·人工智能·sql·开源·数据治理
这个DBA有点耶1 小时前
期货 CTP 系统 Oracle RAC 迁移国产库实战:读写分离架构设计与性能对标
数据库·架构·dba
数据库安全1 小时前
AI数据访问安全 |如何控制AI访问权限,防止越权
数据库·安全
小羊没烦恼!2 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
这个DBA有点耶2 小时前
Redo Log循环写与checkpoint推进:长事务阻塞下的Checkpoint风暴完整链路
数据库·mysql·代码规范
jnrjian2 小时前
pg_waldump --key-file-name status 查看wal 产生的db
数据库
SelectDB技术团队3 小时前
Snowflake 的开源替代怎么选:能力对照、三条部署路径与迁移执行
大数据·数据库·云原生·开源·snowflake·apache doris
Elastic 中国社区官方博客3 小时前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
京东云开发者3 小时前
当我谈数据库高可用时我谈些什么
数据库
梦影_4 小时前
MySQL进阶教程(一)—— 储存过程与触发器(上)
开发语言·数据库·后端·sql·mysql·中间件