在 MySQL 中创建索引是提升查询性能的关键手段。合理使用索引可以显著加快数据检索速度,但不恰当的索引反而会拖慢写入性能并占用额外存储空间。下面介绍如何正确创建索引以及常见的优化方法。
一、MySQL 中创建索引的基本语法
可以在建表时创建索引,也可以对已有表添加索引。
1. 创建普通索引:CREATE INDEX idx_name ON table_name(column);
2. 创建唯一索引:
CREATE UNIQUE INDEX idx_unique ON table_name(column);
3. 创建组合索引(多列索引):
CREATE INDEX idx_composite ON table_name(col1, col2, col3);
4. 建表时定义索引:
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100),
INDEX idx_name (name),
UNIQUE INDEX idx_email (email),
INDEX idx_name_email (name, email)
);
二、选择合适的列创建索引
不是所有列都适合加索引。应优先为以下类型的列建立索引:
频繁用于 WHERE 条件的列:如 status、user_id 等过滤字段。 JOIN 关联字段:外键或经常做连接操作的列,如 order.user_id = user.id。 ORDER BY 和 GROUP BY 后的列:避免 filesort,提高排序和分组效率。 高选择性的列:唯一值多的列(如手机号),低选择性(如性别)通常不适合单列索引。三、组合索引的设计原则(最左前缀法则)
组合索引遵循“最左前缀”匹配规则,查询必须从索引最左边的列开始使用才能生效。
例如,有索引 (name, age, city):
WHERE name = '张三' → 可用索引 WHERE name = '张三' AND age = 25 → 可用索引 WHERE name = '张三' AND age = 25 AND city = '北京' → 完全命中 WHERE age = 25 OR city = '北京' → 无法使用该组合索引建议将筛选性强、使用频率高的列放在组合索引的前面。
四、避免过度索引与维护成本
虽然索引能加速查询,但也有代价:
每增加一个索引,INSERT、UPDATE、DELETE 操作都会变慢,因为需要同步更新索引树。 索引占用磁盘空间,尤其是大字段或多个组合索引。 过多索引会影响查询优化器的选择效率。建议定期审查无用索引,可通过以下语句查看未被使用的索引:
SELECT * FROM sys.schema_unused_indexes;
或查询 information_schema 统计信息进行分析。
五、其他优化建议
避免在索引列上使用函数或表达式:如 WHERE YEAR(create_time) = 2024,会导致索引失效。应改为范围查询。 尽量使用覆盖索引:即查询字段全部包含在索引中,避免回表。例如索引 (name, age),查询 SELECT name, age FROM users WHERE name='张三' 就无需访问数据行。 小表不必强加索引:数据量很小的情况下,全表扫描可能更快。 考虑使用前缀索引:对于长字符串字段(如 VARCHAR(255)),可只索引前几位,如 INDEX idx_title (title(10)),但需权衡区分度。基本上就这些。掌握索引创建的基本语法和优化思路,结合实际查询场景设计索引,才能真正发挥其性能优势。关键是理解执行计划(EXPLAIN),通过分析 SQL 是否走索引、是否回表、是否排序来持续调优。
