MySQL 索引机制实战:从 ORM 到 EXPLAIN 分析
在过往的开发中,我们常依赖 ORM 框架管理数据库,容易忽略底层索引细节。许多人误以为除非显式定义,否则表中不存在索引。深入理解 MySQL 索引后,才意识到这种认知存在偏差。
实际上,ORM 框架在迁移时会依据模型定义生成键约束,MySQL 则根据这些约束自动构建索引类型。主键对应 PRI,唯一约束对应 UNI,外键对应 MUL。
环境信息
本次测试基于以下版本:
SELECT version();
-- 结果示例:5.7.18
索引与 Key 的对应规则
通过 SHOW CREATE TABLE 和 DESCRIBE 可以直观看到索引类型。以 sk_model 表为例:
SHOW CREATE TABLE sk_model;
结构定义中包含主键、唯一键及外键约束。对应的列属性如下:
Field | Type | Null | Key | Default | Extra
id | int(11) | NO | PRI | NULL | auto_increment
name | varchar(60) | NO | UNI | NULL |
created_by_fk | int(11) | YES | MUL | NULL |
changed_by_fk | int(11) | YES | MUL | NULL |
单列唯一性索引测试
查询场景
使用 EXPLAIN 查看执行计划:
EXPLAIN SELECT * FROM sk_model WHERE name = 'lasso';
结果显示 type 为 const,表明该查询直接命中索引,效率较高。
排序场景
尝试对唯一索引字段进行排序:
EXPLAIN SELECT * FROM sk_model ORDER BY name DESC;
此时 Extra 显示 Using filesort,且 key 为 NULL。这说明仅靠唯一索引无法避免额外的排序开销,除非配合覆盖索引等策略。
单列非唯一性索引测试
无 LIMIT 情况
EXPLAIN SELECT * FROM sk_model ORDER created_by_fk;

