單鍵索引還是組合索引

2021-06-09 17:19:52 字數 1328 閱讀 9033

8.4.6  單鍵索引還是組合索引

在大概了解了mysql 各種型別的索引,以及索引本身的利弊與判斷乙個字段是否須要建立索引之後,就要著手建立索引來優化query 了。在很多時候,where 子句中的過濾條件並不只是針對於單一的某個字段,經常會有多個字段一起作為查詢過濾條件存在於 where 子句中。在這種時候,就必須要判斷是該僅僅為過濾性最好的字段建立索引,還是該在所有字段(過濾條件中的)上建立乙個組合索引。

對於這種問題,很難有乙個絕對的定論,須要從多方面來分析考慮,平衡兩種方案各自的優劣,然後選擇一種最佳的方案。因為從上一節中已了解到索引在提高某些查詢的效能同時,也會讓某些更新的效率下降。而組合索引中因為有多個字段存在,理論上被更新的可能性肯定比單鍵索引要大很多,這樣帶來的附加成本也就比單鍵索引要高。但是,當where 子句中的查詢條件含有多個欄位時,通過這多個字段共同組成的組合索引的查詢效率肯定比只用過濾條件中的某乙個字段建立的索引要高。因為通過單鍵索引過濾的資料並不完整,和組合索引相比,儲存引擎須要訪問更多的記錄數,自然就會訪問更多的資料量,也就是說需要更高的 io 成本。

可能有朋友會說,那可以建立多個單鍵索引啊。確實可以將 where 子句中的每乙個欄位都建立乙個單鍵索引。但是這樣真的有效嗎?在這樣的情況下,mysql query optimizer 大多數時候都只會選擇其中的乙個索引,然後放棄其他的索引。即使他選擇了同時利用兩個或更多的索引通過 index_merge 來優化查詢,所收到的效果可能並不會比選擇其中某乙個單鍵索引更高效。因為如果選擇通過 index_merge 來優化查詢,就須要訪問多個索引,同時還要將幾個索引進行 merge 操作,這帶來的成本可能反而會比選擇其中乙個最有效的索引更高。

在一般的應用場景中,只要不是其中某個過濾欄位在大多數場景下能過濾90%以上的資料,而其他的過濾欄位會頻繁的更新,一般更傾向於建立組合索引,尤其是在併發量較高的場景下。因為當併發量較高的時候,即使只為每個query節省了很少的 io 消耗,但因為執行量非常大,所節省的資源總量仍然是非常可觀的。

當然,建立組合索引並不是說就須要將查詢條件中的所有欄位都放在乙個索引中,還應該盡量讓乙個索引被多個 query 語句利用,儘量減少同乙個表上的索參數量,減少因為資料更新帶來的索引更新成本,同時還可以減少因為索引所消耗的儲存空間。

此外,mysql 還提供了另外乙個優化索引的功能,那就是字首索引。在 mysql 中,可以僅僅使用某個欄位的前面部分內容做為索引鍵索引該欄位,以達到減小索引占用的儲存空間和提高索引訪問效率的目的。當然,字首索引的功能僅僅適用於字段字首隨機重複性很小的字段。如果須要索引的字段字首內容有較多的重複,索引的過濾性自然也會隨之降低,通過索引所訪問的資料量就會增加,這時候字首索引雖然能夠減少儲存空間消耗,但是可能會造成 query 訪問效率的極大降低,得不償失。

單鍵索引還是組合索引

8.4.6 單鍵索引還是組合索引 在大概了解了mysql 各種型別的索引,以及索引本身的利弊與判斷乙個字段是否須要建立索引之後,就要著手建立索引來優化query 了。在很多時候,where 子句中的過濾條件並不只是針對於單一的某個字段,經常會有多個字段一起作為查詢過濾條件存在於 where 子句中。...

復合索引(組合索引)

使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 1.何時是用復合索引 在where條件中字段用索引,如果用多字段就用復合索引。比如在查詢位址的時候,經常要求輸入省,市資訊,如果同時在省,市上建立索引,將會提高查詢速度。2.對於復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效...

復合索引(組合索引)

使用者可以在多個列上建立索引,這種索引叫做復合索引 組合索引 1.何時是用復合索引 在where條件中字段用索引,如果用多字段就用復合索引。比如在查詢位址的時候,經常要求輸入省,市資訊,如果同時在省,市上建立索引,將會提高查詢速度。2.對於復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效...