复合索引是否有效取决于WHERE和ORDER BY字段顺序是否与索引定义严格对齐;需在Navicat“设计表→索引”页手动设置字段顺序,等值条件放最左、范围条件居中、排序字段靠右,并用EXPLAIN验证key是否命中。

复合索引建得对不对,不看SQL写得多漂亮,只看WHERE和ORDER BY里字段的顺序是否跟索引定义严格对齐。Navicat 的 ER 图本身不显示索引结构,但表设计器里的「索引」页能直接反映字段顺序,这才是判断依据。
怎么在表设计器里创建符合查询逻辑的复合索引
Navicat 的「设计表 → 索引」页是唯一能直观控制字段顺序的地方。你不能靠猜,必须对照实际高频查询来排字段:
- 等值条件(
=、IN)放最左,比如WHERE status = ? AND category = ?→ 索引前两位必须是status、category - 范围条件(
>、BETWEEN)只能放在等值字段之后,且只能有一个“断点”,比如status = ? AND created_at > ?→ 索引应为(status, created_at),不能再往后加字段 - 排序字段(
ORDER BY created_at DESC)可放在最后,但前提是前面所有字段都满足最左前缀匹配;如果只查category,哪怕索引里有它,也完全用不上 - 命名建议用语义化前缀,比如
idx_orders_status_category_created,避免日后分不清idx_1到底对应哪条查询
为什么ER图里看不到复合索引字段顺序
Navicat 的 ER 图只展示表、字段、主键、外键这些逻辑关系,索引属于物理层优化手段,不在 ER 模型表达范围内。你点击任意表,在 ER 图中双击打开的仍是「设计表」窗口,真正决定索引是否生效的,是那个「索引」页里的字段排列——不是图上连线的方向,也不是字段在列表里的上下位置。
常见误解:有人拖动字段调整顺序后以为索引自动重排,其实那只是修改了表结构中字段的显示顺序,跟索引定义毫无关系。索引字段顺序必须在「索引」页里单独编辑。
如何验证刚建的复合索引真被用了
别信 Navicat 右下角“已添加索引”的提示,得用 EXPLAIN 看执行计划:
- 执行
EXPLAIN SELECT * FROM orders WHERE status = 'shipped' ORDER BY created_at DESC; - 检查返回结果中的
key字段是否为你刚建的索引名,type是否为ref或range(不是ALL) - 如果
key为空但possible_keys有值,说明索引存在但没被选中——大概率是 WHERE 条件跳过了最左字段,或发生了隐式类型转换(比如VARCHAR字段没加引号) - 刚导入大量数据后,务必补一句
ANALYZE TABLE orders;,否则统计信息过期,优化器会误判索引价值
最易被忽略的一点:Navicat 还原数据库时,默认不还原索引,即使你勾了「表」,也得手动勾选「索引」对象;.nb3 备份更彻底不存 DDL,还原后必须手写 CREATE INDEX 补全——图形界面点几次“添加索引”反而容易漏掉 USING BTREE 或大小写不一致。


















