JOIN 性能:受主键选择或列顺序影响?

JOIN performance: affected by primary key choice or column order?

我有一个 table labor 有 20 列和 3000 万行。一列 lab_id 是一个外键并且有一个索引(不是唯一的)。另一个 table map 有 10 列并且有主键 id 和一个唯一索引列 lab_id。我想用 map:

中的内容更新 labor 中的某些列
UPDATE labor r
INNER JOIN map m ON r.lab_id = m.lab_id
SET r.col5 = m.col5
  , r.col6 = m.col6
  , r.col7 = m.col7
;

labor.lab_id可以放在第二列或最后一列。用于连接的索引列的位置是否影响更新的性能?

如果删除 map.id 并将 map.lab_id 定义为主键,性能是否会改变?

table 中的列顺序没有明显差异。

主键的选择确实在InnoDB中有所不同。该存储引擎使用 table 的主键作为 so-called clustered index。 table 的内容存储在该聚簇索引中,而不是存储在 DBMS 的 table space 的其他部分中。因此,当您的查询引用主键时,查询规划器可以立即访问行中的其余数据。

相比之下,non-primary 键,即使是唯一键(在 InnoDB 中)也会检索主键,查询计划器使用该主键来访问聚簇索引。因此通过主键的行引用需要更少的数据访问操作。加起来。

如果你的id列是一个自增列并且你希望继续这样使用它,你可以将它放入一个唯一索引中,然后更改主键。类似于此的 DDL 语句即可解决问题。

ALTER TABLE map
     ADD UNIQUE INDEX id(id),
     DROP PRIMARY KEY,
     ADD PRIMARY KEY (lab_id);

这可能是个好方法,因为您的 table 将继续运行,而无需更改现有软件。

这种 DDL 语句一次处理多个键。这是进行更改的最有效方法,因为它会立即进行所有 table 重组。还需要时间。

至于性能。 Insert/update 性能变化不大:插入和更新仍然需要检查和更新两个唯一键。查询性能会变得更好。

(以上None适用于MyISAM或AriaDB存储引擎。)