🗂️ MySQL 索引详解

68次阅读
没有评论

📌 一、常见的索引类型

索引类型 描述
🔑 PRIMARY KEY 主键索引,唯一且不允许为 NULL。一张表只能有一个主键。
🔐 UNIQUE 唯一索引,列值必须唯一,但可以为 NULL
📘 INDEX / KEY 普通索引,加速查询,但不强制唯一性。
🔍 FULLTEXT 全文索引,用于 TEXT 类型字段的全文搜索。
🌐 SPATIAL 空间索引,用于 GIS 数据类型(如 POINTGEOMETRY)。

🛠️ 二、创建索引语法

-- 创建普通索引
CREATE INDEX idx_column ON table_name(column_name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique ON table_name(column_name);

-- 添加主键索引
ALTER TABLE table_name ADD PRIMARY KEY (column_name);

-- 创建复合索引(多列组合)
CREATE INDEX idx_multi ON table_name(column1, column2);

✅ 三、索引的优势

  • 🚀 提升查询性能:加快 SELECT 查询的速度。
  • 🔐 唯一性约束:如 UNIQUEPRIMARY KEY 确保数据唯一。
  • 🧩 加速连接操作:提高 JOIN 的匹配效率。
  • 📊 优化排序/分组:加速 ORDER BYGROUP BY 操作。
  • 🔎 提高数据定位效率:减少扫描行数。

⚠️ 四、索引的代价(缺点)

  • 🧠 增加存储开销:每个索引都需要额外的磁盘空间。
  • 🐢 插入/更新/删除变慢:每次数据变更都需更新索引。
  • 🧭 维护成本高:过多或无用索引反而拖慢性能。

💡 五、适用场景

  • WHERE 子句中频繁使用的字段
  • JOIN 条件中的字段
  • 排序(ORDER BY)和分组(GROUP BY)字段
  • 需要唯一性的字段(如用户邮箱、用户名)
  • 高并发读取的数据表

🔍 六、查看与删除索引

-- 查看某表的所有索引
SHOW INDEX FROM table_name;

-- 删除索引(非主键)
DROP INDEX idx_name ON table_name;

-- 删除主键索引
ALTER TABLE table_name DROP PRIMARY KEY;

❗ 七、索引失效的常见原因

场景 描述
使用函数 例:WHERE YEAR(birthdate) = 2020,索引失效
模糊匹配前缀 例:LIKE '%abc',不能使用索引
数据类型不一致 WHERE id = '123',若 id 是整型,可能触发隐式转换
未使用最左前缀 对复合索引未按顺序使用,无法命中索引
使用 OR 条件 某些 OR 查询不能使用多个字段的联合索引

📎 建议:配合 EXPLAIN 分析查询计划,判断是否使用了索引。

EXPLAIN SELECT * FROM table_name WHERE column = 'value';
正文完
 0
评论(没有评论)