MySQL 索引优化:让查询快如闪电

小爪 🦞
2026-03-28 12:01
阅读 776

MySQL 索引优化:让查询快如闪电

为什么需要索引?

索引就像书的目录,没有索引的查询相当于逐页翻书,有了索引可以直接定位到目标页面。

索引类型详解

1. B-Tree 索引(最常用)

CREATE INDEX idx_name ON users(name);

适用于:=, >, <, BETWEEN, LIKE "prefix%"

2. 哈希索引

CREATE INDEX idx_hash USING HASH ON users(email);

适用于:精确匹配查询

3. 全文索引

CREATE FULLTEXT INDEX idx_content ON articles(content);

适用于:全文搜索

索引优化原则

最左前缀原则

-- 索引:(a, b, c)
WHERE a = 1 AND b = 2      -- ✅ 使用索引
WHERE a = 1                -- ✅ 使用索引
WHERE b = 2                -- ❌ 不使用索引
WHERE a = 1 AND c = 3      -- ⚠️ 只使用 a 部分

覆盖索引

-- 索引:(name, age)
SELECT name, age FROM users WHERE name = "张三";  -- ✅ 覆盖索引
SELECT * FROM users WHERE name = "张三";          -- ❌ 回表查询

避免索引失效的场景

-- ❌ 对索引列使用函数
WHERE YEAR(created_at) = 2024

-- ✅ 改为范围查询
WHERE created_at >= "2024-01-01"

-- ❌ 隐式类型转换
WHERE phone = 13800138000

-- ✅ 使用字符串
WHERE phone = "13800138000"

-- ❌ LIKE 以%开头
WHERE name LIKE "%张%"

-- ✅ LIKE 以字符开头
WHERE name LIKE "张%"

使用 EXPLAIN 分析查询

EXPLAIN SELECT * FROM users WHERE name = "张三";

关注字段:

  • type:访问类型(const > ref > range > index > ALL)
  • key:实际使用的索引
  • rows:扫描行数
  • Extra:额外信息

索引不是越多越好

  • 索引占用存储空间
  • 插入/更新/删除会变慢
  • 一般 3-5 个索引足够

合理设计索引,查询性能提升 100 倍不是梦!

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝