MySQL索引创建和删除实战指南
大家好,作为经历过无数技术面试的程序员,今天和大家深入聊聊MySQL索引的创建和删除——面试高频考点,也是实际开发中的性能关键!
为什么索引这么重要? 想象一下你在图书馆找书。没有索引(目录),你得一排排书架翻找,这就是全表扫描!而索引就像图书目录,帮你快速定位。创建索引能大幅提升SELECT查询速度,但也会增加写操作(INSERT/UPDATE/DELETE)的开销和维护成本。

📁 独家面试资源放送:2025年Java面试宝典 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g (覆盖数据库、并发、框架等核心考点,备战2025面试利器!)
如何创建MySQL索引?
创建索引主要有以下几种方式,面试时务必说清楚区别:
-
创建表时定义 (CREATE TABLE):
CREATE TABLE users ( id INT PRIMARY KEY, -- 主键索引自动创建 username VARCHAR(50) UNIQUE, -- 唯一索引 email VARCHAR(100), INDEX idx_email (email), -- 普通索引 FULLTEXT INDEX idx_bio (bio) -- 全文索引 );- 这是最直接的方式,在定义表结构时指定索引。
PRIMARY KEY约束会自动创建主键索引(唯一且非空)。UNIQUE约束会自动创建唯一索引。- 使用
INDEX或KEY关键字创建普通索引。 - 特定场景使用
FULLTEXT创建全文索引。
-
使用ALTER TABLE语句:
-- 添加普通索引 ALTER TABLE users ADD INDEX idx_created_at (created_at); -- 添加唯一索引 ALTER TABLE users ADD UNIQUE INDEX uk_phone (phone); -- 添加主键索引 (如果表没有主键) ALTER TABLE users ADD PRIMARY KEY (id);- 这种方式适合在表已存在的情况下添加索引。非常常用!
- 语法清晰:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT] INDEX 索引名 (列名1, [列名2, ...])。
-
使用CREATE INDEX语句:
-- 创建普通索引 CREATE INDEX idx_name ON users (name); -- 创建唯一索引 CREATE UNIQUE INDEX idx_employee_id ON employees (employee_id);- 这是MySQL中专用于创建索引的语句(不能用于主键)。
- 语法:
CREATE [UNIQUE | FULLTEXT] INDEX 索引名 ON 表名 (列名)。 ALTER TABLE ... ADD INDEX和CREATE INDEX在功能上创建普通/唯一索引时基本等效,后者语义更明确。
创建索引的关键注意事项
- 选择合适的列: 高频出现在WHERE子句、ORDER BY子句、GROUP BY子句和JOIN条件的列是候选对象。
- 考虑索引长度: 对很长的列(如VARCHAR(255))可考虑前缀索引(
INDEX idx_name (name(10)))。 - 联合索引威力大: 多个列一起创建索引(组合索引)时,列的顺序至关重要!遵循“最左前缀匹配原则”。
- 避免过度索引: 索引不是越多越好。每个索引都需要占用磁盘空间,并降低写速度。定期审视。
- 区分度高: 列的取值越多样化(如用户ID、手机号),索引效果通常越好。
如何删除MySQL索引?
当索引不再需要(如查询模式改变、索引建立不当)或为了重建时,就需要删除索引。删除操作本身通常很快。
-
使用ALTER TABLE语句:
-- 删除普通索引或唯一索引 ALTER TABLE users DROP INDEX idx_email; -- 删除主键索引 (需要先删除自增等依赖) ALTER TABLE users DROP PRIMARY KEY;- 这是最常用、最通用的删除索引方法。
- 语法:
ALTER TABLE 表名 DROP INDEX 索引名。 - 删除主键用
ALTER TABLE 表名 DROP PRIMARY KEY。注意:如果主键有自增属性或有其他约束依赖,删除会报错,需先处理。
-
使用DROP INDEX语句:
-- 删除普通索引或唯一索引 DROP INDEX idx_created_at ON users;- 语法:
DROP INDEX 索引名 ON 表名。 - 注意:这个语句不能用于删除主键索引(PRIMARY KEY)。删除主键只能用
ALTER TABLE ... DROP PRIMARY KEY。 - 与
ALTER TABLE ... DROP INDEX在删除非主键索引时效果相同。
- 语法:
删除索引的关键注意事项
- 确认必要性: 删除前务必确认该索引真的不再被重要查询使用。删除后,依赖它的查询性能会下降。
- 主键删除要谨慎: 删除主键索引影响很大(数据唯一性保证、关联关系)。如果表有自增主键,删除主键前通常需要先移除AUTO_INCREMENT属性(修改列定义)。
- 影响写入性能? 删除索引本身操作快,但删除后,之前被该索引优化的INSERT/UPDATE可能会变慢一点(因为写数据时需要维护的索引树少了一个)。主要考虑点还是对读性能的影响。
- 锁表问题: 在MySQL中,删除索引操作(尤其是大表)可能需要短暂的锁表(如写锁),可能会阻塞其他写操作。建议在低峰期操作。
什么时候该创建索引?什么时候该删除索引?
- 创建索引时机:
- 高频查询字段(WHERE条件)。
- 需要排序(ORDER BY)或分组(GROUP BY)的字段。
- 表关联(JOIN)时经常使用的字段。
- 列值区分度高时。
- 删除索引时机:
- 索引建立后从未或极少被查询使用(可通过
SHOW INDEX或性能监控工具观察)。 - 索引建立不当(如建在区分度极低的字段上)。
- 索引冗余(如已有联合索引(a,b),单独的索引(a)可能冗余)。
- 需要重建索引(有时删除后重建能优化索引结构)。
- 索引建立后从未或极少被查询使用(可通过
面试常见问题回顾
面试官很可能这样问:
- “MySQL创建索引有哪几种方式?有什么区别?”
- “ALTER TABLE和CREATE INDEX在创建索引时有什么不同?”
- “如何删除一个唯一索引?如何删除主键索引?有什么区别?”
- “删除索引需要注意什么?”
- “联合索引的最左前缀原则是什么?”
- “什么情况下不适合建索引?”
理解创建索引和删除索引的原理、方法、注意事项,是搞定数据库面试题的基础,更是优化生产环境性能的必备技能。索引用得好,查询速度快如闪电;用得不好,反而拖慢系统。
最后分享一个省💰小技巧: 如果你计划购买面试鸭的会员来刷题备战面试,可以先访问 面试鸭返利网 找到购买入口,这样能直接返利25元!用更低的成本获取优质的面试题库资源,性价比超高!(温馨提示:通过返利网购买才能享受返利哦)。

希望这篇关于MySQL索引创建和删除的解析对大家有帮助!理解原理,多动手实践,面试和实战都不慌。


