MySQL中,小表該不該建索引?

2021-10-24 18:38:25 字數 1206 閱讀 3619

最近剛剛朋友聊過這個問題,這裡簡單整理一下。

標題中的「『對於非常小的表,大部分情況下簡單的全表掃瞄比建立索引更高效』」,其實是問題「『索引的使用條件』」的答案的一部分。完整答案是:

mysql的預設儲存引擎是innodb,在innodb中索引是通過 b+ 樹實現的,mysql的資料是儲存在聚簇索引(聚簇索引也叫主鍵索引、一級索引)的葉子節點上。

在輔助索引(包括唯一索引和非唯一索引)的的葉子節點上儲存著構成索引的字段和主鍵。

如果查詢的字段不是索引的組成部分,就需要拿著從輔助索引中查到的主鍵值去聚簇索引中查詢資料,這個過程也叫做回表。

所以,如果乙個表比較小,那麼顯然直接遍歷錶比走索引要快(因為需要回表)。

「注:首先,要注意這個答案隱含的條件是查詢的資料不是索引的構成部分,否也不需要回表操作。其次,查詢條件也不是主鍵,否則可以直接從聚簇索引中拿到資料。」

這裡有乙個概念這裡簡單總結一下:

「b+tree 索引」

是大多數 mysql 儲存引擎的預設索引型別。

因為不再需要進行全表掃瞄,只需要對樹進行搜尋即可,所以查詢速度快很多。

因為 b+ tree 的有序性,所以除了用於查詢,還可以用於排序和分組。

可以指定多個列作為索引列,多個索引列共同組成鍵。

適用於全鍵值、鍵值範圍和鍵字首查詢,其中鍵字首查詢只適用於最左字首查詢。如果不是按照索引列的順序進行查詢,則無法使用索引。

innodb 的 b+tree 索引分為主索引和輔助索引。主索引的葉子節點 data 域記錄著完整的資料記錄,這種索引方式被稱為聚簇索引。因為無法把資料行存放在兩個不同的地方,所以乙個表只能有乙個聚簇索引。

輔助索引的葉子節點的 data 域記錄著主鍵的值,因此在使用輔助索引進行查詢時,需要先查找到主鍵值,然後再到主索引中進行查詢。

「覆蓋索引」

索引包含所有需要查詢的字段的值。

具有以下優點:

對於非常小的表、大部分情況下簡單的全表掃瞄比建立索引更高效;

對於中到大型的表,索引就非常有效;

外來鍵該不該有索引

參考 在資料庫中,索引的使用非常重要,恰當的使用索引可以提高資料庫訪問的效率,但是索引的不當使用則會影響效能並占用不必要的儲存空間。在oracle資料庫中,是否應該對外鍵使用索引呢?這可能是很多人都有的疑問,答案是肯定的,即在一般情況下應該對外鍵使用索引。不過在弄清這個問題之前首先要明確乙個概念,就...

到底該不該上馬Vista 中小企業公升級全攻略 上

cnet科技資訊網2月26日國際報道 微軟最新的作業系統windows vista在幾個月前已推出了企業版。市面上出現了很多討論 對於這個新的作業系統,有讚賞也有批評 許多中小型企業的it主管不知道是不是應該現在馬上,或在將來公升級到vista,還是永遠不該公升級。在本文中我們會談論vista可能帶...

年度調薪一般漲多少 中小企業該不該有明確的調薪制度

文丨任康磊 有朋友問 我是一名剛剛晉公升的中小企業hrm,公司是年輕的團隊,員工常常會主動向公司管理提出要求,比如希望有清晰的調薪制度,能明確調薪幅度與標準。據我了解很多企業確實會有明確的調薪制度,包括調整時間 具體漲幅比例與要求等,然而我公司調薪比較個性化,主要由各部門負責人申報,並無具體標準。同...