Mysql
在 MySQL 5.6 中附加未使用的 AUTO_INCREMENT 列是否有任何性能原因?
在我的工作環境中,MySQL 有一些奇怪的性能問題,而其他開發人員之一希望我在刪除具有該
AUTO_INCREMENT
屬性的列之前研究這種情況。設想
我們有一個表,它有一個 FOREIGN KEY,用於索引到它。它目前還有一個
AUTO_INCREMENT
屬性被定義為 KEY 的列,但該 KEY 完全未使用。題
只是想確認 MySQL 沒有做一些奇怪的事情,如果表上沒有包含該
AUTO_INCREMENT
屬性的列會減慢速度。考慮
我想刪除未使用的
AUTO_INCREMENTed
列,而且這個操作似乎很有可能只會加快我們的速度。
是和不是。
(以下適用於所有版本,但僅適用於 ENGINE=InnoDB。)
InnoDB 表總是有一個
PRIMARY KEY
:
- 你可以指定一個;別的
UNIQUE
具有非空列的鍵;別的- 一個隱藏的 6 字節數字。(這個數字不存在。)
如果您刪除 PK,則選項 2 或 3 將生效。如果選項 3 生效,每行將大 2 個字節——假設您的 id 現在是 4 個字節
INT
。這是一個很小的性能損失。表中數據按以下順序排列
PRIMARY KEY
:
- 使用
AUTO_INCREMENT
或隱藏鍵,新插入被“附加”到表中;- 使用其他鍵
UNIQUE
或PRIMARY
鍵,將行插入“它們所屬的位置”。這效率有點低。當您需要對錶進行維護時,您通常需要一種獨特的方式來辨識每一行。僅出於這個原因,我主張有一個可見的、明確的
PRIMARY KEY
.哪個是“更好”
PRIMARY KEY
:
- 一個
AUTO_INCREMENT
?- 由一個或多個自然唯一的列組成的“自然”鍵?
答:視情況而定。由於這不是您問題的主題,我將把詳細說明推遲到另一個問答中。此外,由於 PK 是一個索引,因此索引可能需要考慮性能。