SQL優化之你真的會用索引嗎?

做者:丶平凡世界 數據庫

來源:SQL數據庫開發函數

提到SQL索引,想必小夥伴們都知道,它是爲了提升查詢效率而生。可是在查詢過程當中,怎麼才能讓咱們的查詢語句使用到索引?相必你們或多或少都會遇到這樣的問題。今天咱們就來回答這個問題。性能

一、彙集索引和非彙集索引優化

索引通常分爲彙集索引和非彙集索引。spa

彙集索引速度很快,但只能建一個,因此儘可能把常常使用的列建成彙集索引。索引

非彙集索引雖然沒彙集索引快,可是能夠建多個,比全表掃描快。開發

二、如何創建高效的索引rem

A.關聯條件上創建索引it

例如:class

SELECT  * FROM  T1

JOIN  T2 ON  T1.ORDER_ID=T2.ORDER_ID;

在關聯條件ON後面的兩個列就能夠分別創建索引,這樣會很快將符合關聯條件的數據查詢出來。

B.在條件查詢上創建索引

例如:

SELECT * FROM T1 

WHERE  T1.PRICE>20;

在WHERE條件PRICE列上就能夠創建索引。

注意:如下幾種狀況不會使用索引

  • 在索引列上使用了運算符的,例如:T1.PRICE*0.5>20,這種不會使用索引
  • 在索引列上使用了函數的,例如:UPPER(T1.ADDRESS)='NEWYORK',也不會使用索引
  • 在使用索引時存在空值NULL的,例如:T1.ADDRESS IS NULL,那麼在查詢時就不會走索引了
  • 字符型數據不加引號也不會使用索引例如:ORDER_ID本來是字符型,T1.ORDER_ID='112'會使用索引,可是若是去掉引號,變成了T1.ORDER_ID=112,查詢語句不會報錯,可是不會使用索引了。
  • 或(OR)和不等(<>,!=)以及NOT IN等這些也不會使用索引
  • 常常使用的LIKE,除了前置匹配,其餘匹配均不走索引例如:T1.ADDRESS LIKE ‘NEW%’,這個走索引,可是像T1.ADDRESS LIKE ‘%NEW%’和T1.ADDRESS LIKE ‘%NEW’則均不走索引了
  • 最後若是查詢優化器判斷全表掃描比走索引還快也不會使用到索引。

C.創建索引的原則

  • 不頻繁寫入和更新的列適合創建索引
  • 常常查詢的列適合創建索引
  • 重複數據較少的能夠創建索引

D.聯合索引的妙用

聯合索引就是幾個列合在一塊兒組成一個索引,這種在WHERE條件中相比單列索引會起到意想不到效果。

例如:

SELECT * FROM T1 WHERE T1.CITY=‘北京’ AND T1.DISTR='海淀區';

這個時候將列CITY和DISTR創建成一個聯合索引,效果會更好。

注意:聯合索引須要按順序走,若是中間某個索引不能使用,那它以後的列均不會使用索引。

例如:

SELECT * FROM T1 

WHERE T1.CITY=‘北京’

AND LEFT(T1.DISTR,3)='海淀區' 

AND T1.ROAD='#10'

若是咱們將CITY,DISTR,ROAD創建成爲聯合索引,因爲索引的前置規則,只會讓CITY走索引,後面的DISTR由於使用了函數,索引失效,最後的ROAD列由於DISTR的失效也會跟着失效,這裏記住便可。

三、什麼狀況不適合創建索引

因爲建立索引和維護索引耗時,時間隨着數據的增長而增長,成正比;須要佔物理空間;當對錶中的數據進行維護時,對索引也要進行維護,這樣就下降了數據的維護速度。基於這些缺點,如下狀況不適合創建索引

  • 對於在查詢過程當中不多使用或參考的列,不該該建立索引。
  • 對於那些只有不多數據值的列,不該該建立索引,例如:性別。
  • 對於那些定義爲image,text和bit數據類型的列,不該該建立索引。
  • 當修改性能遠大於檢索性能,不該該創建索引。
  • 重複值較多的也不適合創建索引。
相關文章
相關標籤/搜索