Navicat 创建聚集索引必须手动选择“Clustered”类型,而非勾选;一个表仅能有一个聚集索引;主键不等于聚集索引,其是否聚集取决于建表时是否存在其他聚集索引。
navicat 本身不提供「勾选聚集」这种一键式可视化开关来创建聚集索引——你看到的“聚集”选项,其实是索引类型下拉菜单里的一个值,不是复选框。直接在 navicat 的索引编辑界面里勾选某个隐藏复选框来“变成聚集索引”,这个操作不存在。
Navicat 中创建聚集索引必须选对索引类型
在 Navicat 的「设计表 → 索引」界面中,新建或编辑索引时,关键字段是「索引类型」下拉框,它有四个可选项:Clustered、Non-Clustered、Spatial、XML。要建聚集索引,必须手动选择 Clustered,而不是默认的 Non-Clustered(Navicat 新建索引默认就是非聚集)。
- 选错成
Non-Clustered,哪怕你填了主键列、勾了「唯一」,建出来的仍是非聚集索引,物理顺序不会改变 - 一个表只能有一个
Clustered索引,如果已有聚集索引,再建第二个会报错:Cannot create more than one clustered index on table 'xxx' - 如果你用 Navicat 图形界面删掉现有聚集索引,再建新的,注意:原聚集索引删除后,表会退化为堆(heap),所有非聚集索引也要重写——大表慎操作
主键 ≠ 聚集索引,但 Navicat 默认行为容易混淆
SQL Server 默认会在主键上自动建 Clustered 索引,但这个行为只发生在「首次创建主键约束且无其他聚集索引」时。Navicat 的「设置主键」操作(比如点字段旁钥匙图标)本质是执行 ALTER TABLE ... ADD CONSTRAINT PK_xxx PRIMARY KEY,是否生成聚集索引取决于当前表状态,不是 Navicat “勾选”出来的。
- 若表已存在
Clustered索引,再加主键,SQL Server 会建Non-Clustered主键约束,Navicat 不会提醒你这点 - Navicat 的「索引」列表里显示的索引名,如果是
PK_XXX,不能反推它是聚集的;得看「索引类型」列是否为Clustered - 想强制主键走非聚集?建主键时显式加
NONCLUSTERED:例如ADD CONSTRAINT PK_user_id PRIMARY KEY NONCLUSTERED (id)
图形界面建 Clustered 索引的三个实操陷阱
Navicat 的索引向导看着直观,但几个默认设置会导致结果和预期不符:
- 「唯一」默认勾选:新建
Clustered索引时,Navicat 默认启用唯一性。但业务上不需要唯一(比如按时间分区的流水表),就得手动取消勾选,否则插入重复值会直接失败 - 「包含列」不在主字段列表里:
INCLUDE列必须切到「选项」页签填写,漏填就无法覆盖查询,执行计划里仍会出现Key Lookup - 排序方向影响范围查询效率:比如建在
(status, created_time)上,ASC和DESC对ORDER BY ... DESC查询是否免排序很关键;Navicat 每列都要单独点开选,不能批量设
真正决定是否是聚集索引的,只有那个下拉菜单里的 Clustered 值——不是勾选框,不是注释,也不是索引名里带“cluster”。大表上线前,务必用 SELECT type_desc FROM sys.indexes WHERE object_id = OBJECT_ID('表名') AND name = '索引名' 确认返回的是 CLUSTERED,别信界面显示。











