什麼索引算是好的索引

埃裡克拓荒發表於2019-03-26
                        這是資料庫索引相關內容的第四篇
複製程式碼

好的索引,你值得擁有

其實好的索引的原則,很簡單,只要滿足三個條件:

  1. 能夠覆蓋查詢語句
  2. 能夠避免排序
  3. 窄索引片

1. 能夠覆蓋查詢語句

舉個例子: select a,c,d from table1 where b = 1 and e = 2 and g > 7;

能夠覆蓋查詢語句,即意味著索引要含:a,b,c,d,e,g

為什麼呢,因為如此一來,所有的查詢結果,都在索引裡能找到,不需要到表資料裡再查詢。

2. 能夠避免排序

舉個例子: select a,c,d from table1 where b = 1 and e = 2 and g > 7 order by g desc;

如果按照a,b,c,d,e,g的順序建立索引,那麼意味著該索引是按照a來排序的,所以在索引過濾完,還需要根據g進行二次排序

那如何才能做到根據g來排序?

很簡單:索引的順序調整一下

b, e, g, a, c, d

假設索引的實際內容如下:
1, 2, 8, x, x, x
1, 2, 9, x, x, x
1, 2,10, x, x, x

因為b=1,e=2是固定的,所以只要把g提到前面,那麼排序必然是按照g來的

如此一來,根據a, b, g過濾好的索引,天然就是排序好的結果

3.窄索引片

什麼是索引片,以及什麼樣的索引片是窄索引片,已經在索引這篇中介紹過了

所謂的索引片,就是優化器根據查詢語句,在索引中,實際使用的用於檢索的索引

舉個例子:select a,c,d from table1 where b = 1 and e = 2 and g > 7 and c < 5 order by g desc;

根據優化器的邏輯:
如果索引是(a,b,c,d,e,g) 那麼索引片是0,即沒有索引片,因為a,在查詢語句中根本就沒有查詢條件

那麼好的索引是什麼樣的:

b, e, g, a, c, d

讓我們來看看這個索引,
當掃描b時,b=1, 加入到索引片中(b);
當掃描e時,e=2, 加入到索引片中(b,e);
當掃描g時,g >7,加入到索引片中(b,e,g),但是因為g是範圍查詢,索引g之後的條件,都不能納入到索引片中

所以最終索引片是(b, e, g) 即用b, e, g來在索引的B樹中找到索引們

那麼c < 5,如果c在索引中,c < 5 就是過濾列,在索引過濾的基礎上,再進行對索引過濾。

所以,對於select a,c,d from table1 where b = 1 and e = 2 and g > 7 order by g desc;

最佳的索引是什麼:

b, e, g, a, c, d

滿足了1, 2,3條,優化器只要對索引進行查詢即可,就能過濾出所要的資料!

那麼索引設計就是這麼簡單嗎?

當然不是,以上只是理想情況下,還有比如:
2,3條不能兼得;
現有資料庫索引已經設計好,投入使用,但是效率低,是不是直接新增一個最佳索引就行?
新增索引的成本?
跨表查詢的情況?等等

索引是門藝術,我們慢慢來~


                                其他相關章節
複製程式碼

資料庫索引相關文章之一:《B樹,一點都不神祕》
資料庫索引相關文章之二:《B樹很簡單,插入so easy》
資料庫索引相關文章之三:《索引》
資料庫索引相關文章之四:《什麼索引算是好的索引》
資料庫索引相關文章之五:《如何發現及替換不合適的索引》
資料庫索引相關文章之六:《索引總結》

相關文章