MySQL為什麼需要乙個主鍵(自增長)

2021-07-13 05:10:52 字數 1424 閱讀 3992

主鍵自增長:alter table sys_manager modify user_id integer auto_increment;

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

乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。

主鍵(primary key) 一列(或一組列),其值能夠唯一區分表中的每個行。

唯一標識表中每行的這個列(或這組列)稱為主鍵。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只設計相關的行。

雖然並不總是都需要主鍵,但大多數資料庫設計人員都應保證他們建立的每個表有乙個主鍵,以便於以後資料操縱和管理

表中的任何列都可以作為主鍵,只要它滿足一下條件:

主鍵值規範:這裡列出的規則是mysql本身強制實施的。

主鍵的最好習慣:

除mysql強制實施的規則外,應該堅持的幾個普遍認為的最好習慣為:

總之:不應該使用乙個具有意義的column(id 本身並不儲存表 有意義資訊) 作為主鍵,並且乙個表必須要有乙個主鍵,為方便擴充套件、松耦合,高可用的系統做鋪墊。

無特殊需求下innodb建議使用與業務無關的自增id作為主鍵

innodb引擎使用聚集索引,資料記錄本身被存於主索引(一顆b+tree)的葉子節點上。這就要求同乙個葉子節點內(大小為乙個記憶體頁或磁碟頁)的各條資料記錄按主鍵順序存放,因此每當有一條新的記錄插入時,mysql會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(innodb預設為15/16),則開闢乙個新的頁(節點)

1、如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢乙個新的頁。

這樣就會形成乙個緊湊的索引結構,近似順序填滿。由於每次插入時也不需要移動已有資料,因此效率很高,也不會增加很多開銷在維護索引上。

2、 如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置

此時mysql不得不為了將新記錄插到合適位置而移動資料,甚至目標頁面可能已經被回寫到磁碟上而從快取中清掉,此時又要從磁碟上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過optimize table來重建表並優化填充頁面。

在使用innodb儲存引擎時,如果沒有特別的需要,請永遠使用乙個與業務無關的自增欄位作為主鍵。

mysql 在頻繁的更新、刪除操作,會產生碎片。而含碎片比較大的表,查詢效率會降低。此時需對表進行優化,這樣才會使查詢變得更有效率

MySQL為什麼需要乙個主鍵

主鍵 表中每一行都應該有可以唯一標識自己的一列 或一組列 乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。主鍵 primary key 一列 或一組列 其值能夠唯一區分表中的每個行。唯一標識表中每行的這個列 或這組列 稱為主鍵。沒有主鍵,更新或刪除表中特...

mysql為什麼建議使用自增主鍵

前面我寫了幾篇關於 mysql 索引的文章,索引是 mysql 非常重要的一部分。你也可能經常會看到一些關於 mysql 軍規 mysql 查詢優化的文章,其實這些操作的背後都是基於一定的原理的,你要想明白這些原理,首先就得知道 mysql 底層的一些東西。我在這裡舉幾個例子吧。我們都知道表的主鍵一...

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

主鍵 表中每一行都應該有可以唯一標識自己的一列 或一組列 乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。主鍵 primary key 一列 或一組列 其值能夠唯一區分表中的每個行。唯一標識表中每行的這個列 或這組列 稱為主鍵。沒有主鍵,更新或刪除表中特...