如何在mysql中创建索引_mysql索引创建优化方法

来源:这里教程网 时间:2026-02-28 20:21:57 作者:

在 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 是否走索引、是否回表、是否排序来持续调优。

相关推荐