MySQL中使用索引是提升查询性能的核心手段,其本质通过创建高效的数据结构(如B+树)快速定位数据,减少全表扫描的开销,索引的合理使用需要从创建、优化到维护全流程掌握,以下从多个维度详细说明。

索引的创建与类型选择
创建索引需基于查询场景选择合适类型,常见的索引类型包括:
- 主键索引(PRIMARY KEY):唯一标识表中的每一行,不允许NULL值,InnoDB引擎会自动将主键索引聚簇存储表数据,用户表的用户ID字段通常设为主键索引:
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
。 - 唯一索引(UNIQUE INDEX):确保列值唯一,但允许NULL值,适用于邮箱、手机号等字段:
CREATE UNIQUE INDEX idx_email ON users(email);
。 - 普通索引(INDEX):最基本的索引类型,无唯一性限制,常用于高频查询条件:
CREATE INDEX idx_name ON users(name);
。 - 组合索引(复合索引):对多个列创建索引,遵循“最左前缀原则”,即查询条件需包含索引最左边的列才能生效,对
(name, age)
创建组合索引,查询条件包含name
或name+age
会走索引,但仅包含age
则不会:CREATE INDEX idx_name_age ON users(name, age);
。 - 全文索引(FULLTEXT INDEX):用于文本搜索,支持分词查询,仅在MyISAM和InnoDB引擎中可用:
CREATE FULLTEXT INDEX idx_content ON articles(content);
。
索引的使用场景与优化原则
索引并非越多越好,需在查询效率与写入性能间平衡,以下场景适合使用索引:
- WHERE条件列:作为查询过滤条件的列(如
SELECT * FROM users WHERE age=25;
中age
字段建索引)。 - JOIN关联列:用于连接两张表的列(如
ON orders.user_id=users.id
中user_id
建索引)。 - ORDER BY/GROUP BY列:排序或分组字段(如
SELECT * FROM users ORDER BY name;
中name
建索引)。 - 覆盖索引:查询字段全部包含在索引中,避免回表操作,索引
(name, age)
可覆盖SELECT name, age FROM users WHERE name='Tom';
,无需访问数据行。
优化原则:
- 避免在索引列上使用函数或表达式(如
WHERE SUBSTR(name,1,3)='Tom'
会导致索引失效)。 - 控制索引列的数据类型长度,如
VARCHAR(50)
可优化为VARCHAR(20)
减少索引大小。 - 定期维护索引,通过
EXPLAIN
分析查询执行计划,检查是否命中索引(type
列显示index
、range
、ref
等表示索引生效,ALL
表示全表扫描)。
索引的维护与管理
随着数据量增长,索引可能因频繁增删改而碎片化,需定期优化:

- 索引碎片整理:使用
OPTIMIZE TABLE users;
回收碎片,提升查询效率。 - 索引删除:无用索引会增加写入负担,可通过
DROP INDEX idx_name ON users;
删除。 - 索引监控:通过
SHOW INDEX FROM users;
查看索引使用情况,结合information_schema.statistics
表分析低效索引。
索引的局限性
- 写入性能下降:每次数据修改(增删改)需同步更新索引,降低写入速度。
- 存储空间占用:索引需额外存储空间,尤其组合索引和大数据量表。
- 不适用场景:小表(数据量少)、区分度低的列(如性别字段)、频繁更新的列不适合建索引。
相关问答FAQs
Q1:为什么有时候明明创建了索引,查询却没有走索引?
A:可能原因包括:索引列参与计算或函数(如WHERE age+1=26
)、使用了或<>
操作符、字符串类型未加引号(如WHERE name=123
而非'123'
)、查询条件违背最左前缀原则(组合索引中跳过左列)、OR
连接的条件中有未建索引的列,可通过EXPLAIN
分析执行计划,确认索引失效原因并优化SQL。
Q2:索引越多越好吗?如何判断索引是否需要删除?
A:并非越多越好,过多索引会占用存储空间并降低写入性能,判断依据:通过information_schema.statistics
表查看INDEX_USAGE
列,统计索引使用频率;长期未被使用的索引(如INDEX_USAGE=0
)可考虑删除;或使用pt-index-usage
等工具分析慢查询日志,识别低效或冗余索引,删除后需监控查询性能,确保不影响业务。
