MySQL中添加普通索引应优先使用ALTER TABLE ADD INDEX或CREATE INDEX语句,选择高区分度、高频查询字段,避免冗余,建前检查选择性与使用场景,建后用SHOW INDEX验证,删除前需确认实际使用。

在 MySQL 中添加普通索引,核心是使用 ALTER TABLE ... ADD INDEX 或 CREATE INDEX 语句,目标字段需具备区分度且非主键/唯一约束时优先考虑普通索引。
用 ALTER TABLE 添加普通索引(最常用)
适用于已有表,语法简洁,支持同时建多个索引:
-
单字段索引:
ALTER TABLE users ADD INDEX idx_email (email); -
多字段联合索引(注意顺序):
ALTER TABLE orders ADD INDEX idx_status_time (status, created_at); -
指定索引名可选但推荐:不指定时 MySQL 自动生成(如
email_2),自定义名更易识别和管理。
用 CREATE INDEX 单独建索引
适合对大表分步优化,或权限受限(部分环境不允许 ALTER TABLE):
- 语法:
CREATE INDEX idx_nickname ON profiles (nickname); - 不能用于主键或唯一约束字段(会报错),仅限普通索引。
- 执行后可通过
SHOW INDEX FROM profiles;验证是否生效。
建索引前的关键检查项
避免无效或负向影响:
-
字段选择性要高:如
gender(只有 'M'/'F')不适合单独建索引;user_id或mobile更合适。 -
WHERE / ORDER BY / JOIN 条件中高频出现的字段优先:例如查询常写
WHERE status = 'paid' ORDER BY updated_at DESC,就适合建(status, updated_at)联合索引。 -
避免冗余索引:已有
(a, b)索引时,再建(a)是多余的;但(b)或(b, a)可能仍有价值。
查看与删除普通索引
日常维护必备操作:
- 查索引:
SHOW INDEX FROM users;(重点关注Key_name和Column_name列) - 删索引:
DROP INDEX idx_email ON users;(注意:MySQL 5.7+ 支持该语法;旧版本用ALTER TABLE users DROP INDEX idx_email;) - 删除前建议先
EXPLAIN SELECT ...确认该索引是否被实际使用。










