文章目錄
-
- 1. 為什麼建議InnoDB表必須建主鍵
- 2. 為什麼推薦使用整型的自增主鍵?
1. 為什麼建議InnoDB表必須建主鍵
首先,我們知道InnoDB采用B+樹作為存儲結構,那麼必然需要一個列作為key,什麼是key?
一個B+樹的節點可以存儲key、位址、行資料(僅葉子節點),key 就是不重複的值且可以比較(確定樹進行分裂時,可以确定是左孩子還是右孩子)。
我們知道主鍵的特定就是
主鍵的值不可重複,也不可為空
,正好符合B+樹key的要求
主鍵特性參見《主鍵的概念作用及特點》
聚簇索引預設是主鍵
,如果表中沒有定義主鍵,InnoDB 會選擇一個
唯一的非空索引
(确切說會選擇一個唯一非空的列作為主鍵)代替。如果沒有這樣的索引,InnoDB 會
隐式定義一個主鍵
來作為聚簇索引。
InnoDB 隻聚集在同一個頁面中的記錄。包含相鄰健值的頁面可能相距甚遠。
如果你已經設定了主鍵為聚簇索引,必須先删除主鍵,然後添加我們想要的聚簇索引,最後恢複設定主鍵即可
聚簇索引性能最好而且具有唯一性,是以非常珍貴,必須慎重設定。一般要根據這個表最常用的SQL查詢方式來進行選擇,某個字段作為聚簇索引,或組合聚簇索引,這個要看實際情況
2. 為什麼推薦使用整型的自增主鍵?
聚簇索引的資料的實體存放順序與索引順序是一緻的,即:隻要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁盤上的。
聚簇索引的順序和磁盤中資料的存儲順序是一緻的,如果主鍵不是自增id,那麼可以想 象,它會幹些什麼,
不斷地調整資料的實體位址、分頁
,當然也有其他一些措施來減少這些操作,但卻無法徹底避免。但,如果是自增的,那就簡單了,它隻需要一 頁一頁地寫,索引結構相對緊湊,磁盤碎片少,效率也高。
即避免頁分裂,參見 頁分裂機制
參考:
《Mysql聚簇索引和非聚簇索引》
《聚簇索引和非聚簇索引:Mysql為什麼建議使用自增id做主鍵》 誤區