摘要:這就要求同一個葉子節點內(大小爲一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認爲15/16),則開闢一個新的頁(節點)。如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不爲了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

Mysql

Dev DataBase

發佈日期:   2020-04-10

更新日期:   2020-05-31

文章字數:   895

閱讀時長:   3 分

閱讀次數:  

InnoDB引擎表的特點

1、InnoDB引擎表是基於B+樹的索引組織表(IOT)

關於B+樹

B+ 樹的特點:

  • 所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;
  • 不可能在非葉子結點命中;
  • 非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;

2、主鍵(PRIMARY KEY)

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作爲聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作爲主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作爲隱含的聚集索引(ROWID隨着行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

3、主索引

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小爲一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認爲15/16),則開闢一個新的頁(節點)

4、自增主鍵

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

5、非自增主鍵

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不爲了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

總結

如果InnoDB表的數據寫入順序能和B+樹索引的葉子節點順序一致的話,這時候存取效率是最高的,也就是下面這幾種情況的存取效率最高:

1、使用自增列(INT/BIGINT類型)做主鍵,這時候寫入順序是自增的,和B+數葉子節點分裂順序一致;

2、該表不指定自增列做主鍵,同時也沒有可以被選爲主鍵的唯一索引(上面的條件),這時候InnoDB會選擇內置的ROWID作爲主鍵,寫入順序和ROWID增長順序一致;

除此以外,如果一個InnoDB表又沒有顯示主鍵,又有可以被選擇爲主鍵的唯一索引,但該唯一索引可能不是遞增關係時(例如字符串、UUID、多字段聯合唯一索引的情況),該表的存取效率就會比較差。

《高性能MySQL》中的原話

文章作者: 少年閏土

文章鏈接: http://likeyou.cool/2020/04/10/mysql-zhong-innodb-biao-wei-shi-me-yao-jian-yi-yong-zi-zeng-lie-zuo-zhu-jian/

版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源少年閏土 !

Mysql

你的賞識是我前進的動力

上一篇

Nginx實現負載均衡

負載均衡即是代理服務器將接收的請求均衡的分發到各服務器中。 負載均衡的優勢在訪問量少或併發小的時候可能並不明顯,且不說淘寶雙11、鐵道部搶票這種級別的訪問量、高併發,就是一般網站的搶購活動時,也會給服務器造成很大壓力,可能會造成服務器崩潰。

2020-04-11 Dev Tools

Nginx

下一篇 

Sentinel入門

前言Sentinel 是什麼?隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。 Sentinel 的歷史 2012 年,Sentinel

2020-04-01 Dev Frame

微服務 Sentinel

相關文章