mysql主鍵重要性 MySQL為什麼需要乙個主鍵

2021-10-19 06:17:09 字數 1422 閱讀 6400

主鍵

表中每一行都應該有可以唯一標識自己的一列(或一組列)。

乙個顧客可以使用顧客編號列,而訂單可以使用訂單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 在頻繁的更新、刪除操作,會產生碎片。而含碎片比較大的表,查詢效率會降低。此時需對表進行優化,這樣才會使查詢變得更有效率。

mysql主鍵,唯一性,索引的重要性

mysql建立 為什麼一定需要索引呢?有部分設計者感覺表資料有沒有主鍵的區別只是為了區分是否唯一,根據mysql資料表的不同資料引擎,其實,還是有區別的,inoodb引擎的表資料,資料結構是使用主鍵為索引的b tree結構組織資料,如果我們建立 時沒有主鍵,mysql會自動使用不可見的並且具有唯一性...

MySQL 連線查詢中索引的重要性

在mysql中,我們要從多張表中讀取資料時,往往需要用到連線查詢。連線查詢通過兩張表中符合連線關係的字段來建立兩張表的關聯,通常包括內連線 左外連線 右外連線和全連線。內連線會保留兩張表中共有的那部分記錄,因此最後產生的連線表記錄數最少 全連線會保留兩張表中所有的記錄,因此最後產生的連線表記錄數最多...

mysql連線查詢中索引的重要性

在mysql中,我們要從多張表中讀取資料時,往往需要用到連線查詢。連線查詢通過兩張表中符合連線關係的字段來建立兩張表的關聯,通常包括內連線 左外連線 右外連線和全連線。內連線會保留兩張表中共有的那部分記錄,因此最後產生的連線表記錄數最少 全連線會保留兩張表中所有的記錄,因此最後產生的連線表記錄數最多...