MySQL / 为什么需要主键?主键为什么最好是单调递增的?
? ? ? ?無(wú)特殊需求下 Innodb 建議使用與業(yè)務(wù)無(wú)關(guān)的自增 ID 作為主鍵。
? ? ? ?InnoDB引擎使用聚集索引,數(shù)據(jù)記錄本身被存于主索引(一顆 B + Tree)的葉子節(jié)點(diǎn)上,這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁(yè)或磁盤(pán)頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放。因此每當(dāng)有一條新的記錄插入時(shí),MySQL 會(huì)根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB 默認(rèn)為 15 / 16 ),則開(kāi)辟一個(gè)新的頁(yè)(節(jié)點(diǎn))。
? ? ? ?1、如果表使用自增主鍵,那么每次插入新的記錄,記錄就會(huì)順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁(yè)寫(xiě)滿(mǎn),就會(huì)自動(dòng)開(kāi)辟一個(gè)新的頁(yè)。
? ? ? ?這樣就會(huì)形成一個(gè)緊湊的索引結(jié)構(gòu),近似順序填滿(mǎn)。由于每次插入時(shí)也不需要移動(dòng)已有數(shù)據(jù),因此效率很高,也不會(huì)增加很多開(kāi)銷(xiāo)在維護(hù)索引上。
? ? ? ? 2、 如果使用非自增主鍵(如果身份證號(hào)或?qū)W號(hào)等),由于每次插入主鍵的值近似于隨機(jī),因此每次新紀(jì)錄都要被插到現(xiàn)有索引頁(yè)得中間某個(gè)位置:此時(shí) MySQL 不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚至目標(biāo)頁(yè)面可能已經(jīng)被回寫(xiě)到磁盤(pán)上而從緩存中清掉,此時(shí)又要從磁盤(pán)上讀回來(lái),這增加了很多開(kāi)銷(xiāo),同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過(guò)OPTIMIZE TABLE 來(lái)重建表并優(yōu)化填充頁(yè)面。
? ? ? ?在使用 InnoDB 存儲(chǔ)引擎時(shí),如果沒(méi)有特別的需要,請(qǐng)永遠(yuǎn)使用一個(gè)與業(yè)務(wù)無(wú)關(guān)的自增字段作為主鍵。
? ? ? ?mysql 在頻繁地更新、刪除操作,會(huì)產(chǎn)生碎片。而含碎片比較大的表,查詢(xún)效率會(huì)降低。此時(shí)需對(duì)表進(jìn)行優(yōu)化,這樣才會(huì)使查詢(xún)變得更有效率。
?
轉(zhuǎn)載于:https://www.jianshu.com/p/33b7b6e0a396
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的MySQL / 为什么需要主键?主键为什么最好是单调递增的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据结构与算法 / B- Tree 和
- 下一篇: MySQL / 基本架构介绍