mysql如何给已有数据表添加索引_使用CREATE INDEX提升查询速度
MySQL建索引需严格校验语法、字段与表名;优先用ALTER TABLE ADD INDEX;复合索引顺序须匹配查询条件;避免冗余索引;大表操作选低峰期;唯一索引承载约束语义;建索引后需ANALYZE TABLE更新统计信息。CREATE INDEX 语法写错会直接报错,不是静默失败MySQL 对 CREATE INDEX 的语法很敏感,尤其字段名、表名、索引类型稍有拼写或大小写不一致(在区分大小写的文件系统上),就会报 ERROR 1146 (42S02): Table doesn't exist 或 ERROR 1054 (42S22): Unknown column。别急着怀疑权限,先核对三件事:SHOW TABLES 确认表名完全匹配(含数据库前缀,如 mydb.users)DESCRIBE table_name 或 SHOW COLUMNS FROM table_name 看字段名是否带反引号、是否真存在单列索引不用写 USING BTREE,但复合索引里如果漏了括号,比如写成 CREATE INDEX idx ON t a,b(缺 (a,b)),会报语法错误WHERE 条件里用不到的字段加索引纯属浪费索引不是越多越好。比如表有 user_id、status、created_at 三个字段,但所有查询都是 WHERE status = ?,那给 created_at 单独建索引几乎没用。真正该做的是:用 EXPLAIN SELECT ... 看 key 列是否命中现有索引复合索引顺序很重要:WHERE status = ? AND created_at > ? 应建 INDEX(status, created_at),反过来则可能失效如果经常 ORDER BY created_at 且带 LIMIT,把 created_at 放复合索引末尾能避免 filesortALTER TABLE ADD INDEX 比 CREATE INDEX 更常用,但锁表风险更高虽然 CREATE INDEX idx ON t(col) 和 ALTER TABLE t ADD INDEX idx(col) 效果一样,但实际运维中更倾向后者,因为它是 DDL 标准写法,工具链(如 pt-online-schema-change)也默认识别它。不过要注意: Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
