天天看點

【mysql】為什麼建議InnoDB表必須建主鍵,并且推薦使用整型的自增主鍵?

文章目錄

    • 1. 為什麼建議InnoDB表必須建主鍵
    • 2. 為什麼推薦使用整型的自增主鍵?

1. 為什麼建議InnoDB表必須建主鍵

首先,我們知道InnoDB采用B+樹作為存儲結構,那麼必然需要一個列作為key,什麼是key?

一個B+樹的節點可以存儲key、位址、行資料(僅葉子節點),key 就是不重複的值且可以比較(確定樹進行分裂時,可以确定是左孩子還是右孩子)。

我們知道主鍵的特定就是

主鍵的值不可重複,也不可為空

,正好符合B+樹key的要求

主鍵特性參見《主鍵的概念作用及特點》

聚簇索引預設是主鍵

,如果表中沒有定義主鍵,InnoDB 會選擇一個

唯一的非空索引

(确切說會選擇一個唯一非空的列作為主鍵)代替。如果沒有這樣的索引,InnoDB 會

隐式定義一個主鍵

來作為聚簇索引。

InnoDB 隻聚集在同一個頁面中的記錄。包含相鄰健值的頁面可能相距甚遠。

如果你已經設定了主鍵為聚簇索引,必須先删除主鍵,然後添加我們想要的聚簇索引,最後恢複設定主鍵即可

聚簇索引性能最好而且具有唯一性,是以非常珍貴,必須慎重設定。一般要根據這個表最常用的SQL查詢方式來進行選擇,某個字段作為聚簇索引,或組合聚簇索引,這個要看實際情況

2. 為什麼推薦使用整型的自增主鍵?

聚簇索引的資料的實體存放順序與索引順序是一緻的,即:隻要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁盤上的。

聚簇索引的順序和磁盤中資料的存儲順序是一緻的,如果主鍵不是自增id,那麼可以想 象,它會幹些什麼,

不斷地調整資料的實體位址、分頁

,當然也有其他一些措施來減少這些操作,但卻無法徹底避免。但,如果是自增的,那就簡單了,它隻需要一 頁一頁地寫,索引結構相對緊湊,磁盤碎片少,效率也高。

即避免頁分裂,參見 頁分裂機制

參考:

《Mysql聚簇索引和非聚簇索引》

《聚簇索引和非聚簇索引:Mysql為什麼建議使用自增id做主鍵》 誤區