正确创建索引可提升查询性能,需根据WHERE、JOIN、ORDER BY等场景选择高选择性列建立单列或组合索引,遵循最左前缀原则,避免在索引列使用函数,优先使用覆盖索引,控制索引数量以降低写入开销和存储占用,并通过EXPLAIN分析执行计划持续优化。

在 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)
);
二、选择合适的列创建索引
不是所有列都适合加索引。应优先为以下类型的列建立索引:
由于疫情等原因大家都开始习惯了通过互联网上租车服务的信息多方面,且获取方式简便,不管是婚庆用车、旅游租车、还是短租等租车业务。越来越多租车企业都开始主动把租车业务推向给潜在需求客户,所以如何设计一个租车网站,以便在同行中脱颖而出就重要了,易优cms针对租车行业市场需求、目标客户、盈利模式等,进行策划、设计、制作,建设一个符合用户与搜索引擎需求的租车网站源码。 网站首页
- 频繁用于 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 是否走索引、是否回表、是否排序来持续调优。









