標籤:記憶體 path 設計 方法 pre inno origin 資料庫 設計規範
原文地址:http://www.jianshu.com/p/33b7b6e0a396主鍵
表中每一行都應該有可以唯一標識自己的一列(或一組列)。
一個顧客可以使用顧客編號列,而訂單可以使用訂單ID,僱員可以使用僱員ID 或 僱員社會保險號。
主鍵(primary key) 一列(或一組列),其值能夠唯一區分表中的每個行。
唯一標識表中每行的這個列(或這組列)稱為主鍵。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只設計相關的行。
雖然並不總是都需要主鍵,但大多數資料庫設計人員都應保證他們建立的每個表有一個主鍵,以便於以後資料操縱和管理
表中的任何列都可以作為主鍵,只要它滿足一下條件:
1、任何兩行都不具有相同的主索引值 2、每個行都必須具有一個主索引值(主鍵列不允許NULL值)
主索引值規範:這裡列出的規則是MySQL本身強制實施的。
主鍵的最好習慣:
除MySQL強制實施的規則外,應該堅持的幾個普遍認為的最好習慣為:
1、不更新主鍵列的值 2、不重用主鍵列的值 3、不在主鍵列中使用可能會更改的值(例如,如果使用一個名字作為主鍵以標識某個供應商,應該供應商合并和更改其名字時,必須更改這個主鍵)
總之:不應該使用一個具有意義的column(id 本身並不儲存表 有意義資訊) 作為主鍵,並且一個表必須要有一個主鍵,為方便擴充、松耦合,高可用的系統做鋪墊。
非常感謝 @pathbox、 @est、@hooooopo 同學的提醒。主鍵的作用,在於索引。
無特殊需求下Innodb建議使用與業務無關的自增ID作為主鍵
InnoDB引擎使用叢集索引,資料記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個記憶體頁或磁碟頁)的各條資料記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB預設為15/16),則開闢一個新的頁(節點)
1、如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁。如所示:
這樣就會形成一個緊湊的索引結構,近似順序填滿。由於每次插入時也不需要移動已有資料,因此效率很高,也不會增加很多開銷在維護索引上。
2、 如果使用非自增主鍵(如果社會安全號碼或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置:
此時MySQL不得不為了將新記錄插到合適位置而移動資料,甚至目標頁面可能已經被回寫到磁碟上而從緩衝中清掉,此時又要從磁碟上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的片段,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並最佳化填充頁面。
在使用InnoDB儲存引擎時,如果沒有特別的需要,請永遠使用一個與業務無關的自增欄位作為主鍵。
mysql 在頻繁的更新、刪除操作,會產生片段。而含片段比較大的表,查詢效率會降低。此時需對錶進行最佳化,這樣才會使查詢變得更有效率。
清水大王
連結:http://www.jianshu.com/p/33b7b6e0a396
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
mysql設計規範一