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存储引擎。)
我有一个 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存储引擎。)