一、為什麼用自增列作為主鍵
1、如果我們定義了主鍵(primary key),那麼innodb會選擇主鍵作為聚集索引。
如果沒有顯式定義主鍵,則innodb會選擇第乙個不包含有null值的唯一索引作為主鍵索引。
如果也沒有這樣的唯一索引,則innodb會選擇內建6位元組長的rowid作為隱含的聚集索引(rowid隨著行記錄的寫入而主鍵遞增,這個rowid不像oracle的rowid那樣可引用,是隱含的)。
2、資料記錄本身被存於主索引(一顆b+tree)的葉子節點上,這就要求同乙個葉子節點內(大小為乙個記憶體頁或磁碟頁)的各條資料記錄按主鍵順序存放
因此每當有一條新的記錄插入時,mysql會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(innodb預設為15/16),則開闢乙個新的頁(節點)
3、如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢乙個新的頁
4、如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置
此時mysql不得不為了將新記錄插到合適位置而移動資料,甚至目標頁面可能已經被回寫到磁碟上而從快取中清掉,此時又要從磁碟上讀回來,這增加了很多開銷
同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過optimize table來重建表並優化填充頁面。
二、為什麼使用資料索引能提高效率
資料索引的儲存是有序的
資料庫面試問題
1 等值查詢,雜湊索引具有絕對優勢 前提是 沒有大量重複鍵值,如果大量重複鍵值時,雜湊索引的效率很低,因為存在所謂的雜湊碰撞問題 在heap表中,如果儲存的資料重複度很低 也就是說基數很大 對該列資料以等值查詢為主,沒有範圍查詢 沒有排序的時候,特別適合採用雜湊索引。何為堆表 2 b樹和b 樹掃盲?...
十個經典的資料庫面試問題
1.磁碟櫃上有14塊 73g的磁碟,資料庫為 200g 大小包括日誌檔案,如何設定磁碟 要說明這 14磁碟是怎麼用的 2.有兩伺服器群集,分別為 node1 和node2 現在要打 win200 系統補丁,打完後,要重新啟動,如何打補丁,不能影響使用者使用 要用群集的術語詳細說明 3.有乙個 a 資...
十個經典的資料庫面試問題
1.磁碟櫃上有14塊 73g的磁碟,資料庫為 200g 大小包括日誌檔案,如何設定磁碟 要說明這 14磁碟是怎麼用的 2.有兩伺服器群集,分別為 node1 和node2 現在要打 win200 系統補丁,打完後,要重新啟動,如何打補丁,不能影響使用者使用 要用群集的術語詳細說明 3.有乙個 a 資...