這是數據庫索引相關內容的第四篇
複製代碼
其實好的索引的原則,很簡單,只要知足三個條件:數據庫
舉個例子: select a,c,d from table1 where b = 1 and e = 2 and g > 7;post
可以覆蓋查詢語句,即意味着索引要含:a,b,c,d,e,g優化
爲何呢,由於如此一來,全部的查詢結果,都在索引裏能找到,不須要到表數據裏再查找。spa
舉個例子: 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進行二次排序code
那如何才能作到根據g來排序?排序
很簡單:索引的順序調整一下索引
b, e, g, a, c, dget
假設索引的實際內容以下:
1, 2, 8, x, x, x
1, 2, 9, x, x, x
1, 2,10, x, x, xtable
由於b=1,e=2是固定的,因此只要把g提到前面,那麼排序必然是按照g來的
如此一來,根據a, b, g過濾好的索引,自然就是排序好的結果
什麼是索引片,以及什麼樣的索引片是窄索引片,已經在索引這篇中介紹過了
所謂的索引片,就是優化器根據查詢語句,在索引中,實際使用的用於檢索的索引
舉個例子: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》
數據庫索引相關文章之三:《索引》
數據庫索引相關文章之四:《什麼索引算是好的索引》
數據庫索引相關文章之五:《如何發現及替換不合適的索引》
數據庫索引相關文章之六:《索引總結》