MySQL InnoDB 索引

邢闖洋發表於2021-05-24

索引是儲存引擎實現的,即使每個儲存引擎的索引一樣,其實現方式也是不一樣的。

InnoDB 主鍵索引的葉子節點存的是整行資料。在 InnoDB 裡,主鍵索引也被稱為聚簇索引(clustered index)。

非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 裡,非主鍵索引也被稱為二級索引(secondary index)。

基於主鍵索引和普通索引的查詢有什麼區別?

  • 如果語句是 select * from T where ID=500,即主鍵查詢方式,則只需要搜尋 ID 這棵 B+ 樹;
  • 如果語句是 select * from T where k=5,即普通索引查詢方式,則需要先搜尋 k 索引樹,得到 ID 的值為 500,再到 ID 索引樹搜尋一次。這個過程稱為回表。

也就是說,基於非主鍵索引的查詢需要多掃描一棵索引樹。因此,我們在應用中應該儘量使用主鍵查詢。

什麼時候需要建立聯合索引,當有這樣一張表,表內有身份證號、名字等資訊,我們有一個需求是需要根據身份證號查詢出來名字,這個需求很高頻,這時候如果單獨給身份證號建立一個索引,查詢名字的話還是需要回表查,我們可以利用覆蓋索引這一特點,對身份證號和名字建立聯合索引,就不需要回表查詢名字。

重建索引

索引可能會因為刪除、新增資料或者頁分裂等操作導致資料有空洞,重建索引會釋放多餘的索引控制元件重新排列。

如何合理重建索引

alter table T engine=InnoDB
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章