Mysql

在 MySQL 5.6 中附加未使用的 AUTO_INCREMENT 列是否有任何性能原因?

  • November 10, 2016

在我的工作環境中,MySQL 有一些奇怪的性能問題,而其他開發人員之一希望我在刪除具有該AUTO_INCREMENT屬性的列之前研究這種情況。

設想

我們有一個表,它有一個 FOREIGN KEY,用於索引到它。它目前還有一個AUTO_INCREMENT屬性被定義為 KEY 的列,但該 KEY 完全未使用。

只是想確認 MySQL 沒有做一些奇怪的事情,如果表上沒有包含該AUTO_INCREMENT屬性的列會減慢速度。

考慮

我想刪除未使用的AUTO_INCREMENTed列,而且這個操作似乎很有可能只會加快我們的速度。

是和不是。

(以下適用於所有版本,但僅適用於 ENGINE=InnoDB。)

InnoDB 表總是有一個PRIMARY KEY

  1. 你可以指定一個;別的
  2. UNIQUE具有非空列的鍵;別的
  3. 一個隱藏的 6 字節數字。(這個數字不存在。)

如果您刪除 PK,則選項 2 或 3 將生效。如果選項 3 生效,每行將大 2 個字節——假設您的 id 現在是 4 個字節INT。這是一個很小的性能損失。

表中數據按以下順序排列PRIMARY KEY

  • 使用AUTO_INCREMENT或隱藏鍵,新插入被“附加”到表中;
  • 使用其他鍵UNIQUEPRIMARY鍵,將行插入“它們所屬的位置”。這效率有點低。

當您需要對錶進行維護時,您通常需要一種獨特的方式來辨識每一行。僅出於這個原因,我主張有一個可見的、明確的PRIMARY KEY.

哪個是“更好” PRIMARY KEY

  • 一個AUTO_INCREMENT
  • 由一個或多個自然唯一的列組成的“自然”鍵?

答:視情況而定。由於這不是您問題的主題,我將把詳細說明推遲到另一個問答中。此外,由於 PK 是一個索引,因此索引可能需要考慮性能。

引用自:https://dba.stackexchange.com/questions/154091