關於索引(內容出自CSDN會員dawugui)

沒必要給所有的列加上索引.
索引是把雙刃劍,有好有壞.給給資料,你參考一下:
1.合理使用索引
索引是數據庫中重要的數據結構,它的根本目的就是爲了提高查詢效率。現在大多數的數據庫產品都採用IBM最先提出的ISAM索引結構。索引的使用要恰到好處,其使用原則如下:  
●在經常進行連接,但是沒有指定爲外鍵的列上建立索引,而不經常連接的字段則由優化器自動生成索引。  
●在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。  
●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在僱員表的“性別”列上只有“男”與“女”兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。  
●如果待排序的列有多個,可以在這些列上建立複合索引(compound index)。  
●使用系統工具。如Informix數據庫有一個tbcheck工具,可以在可疑的索引上進行檢查。在一些數據庫服務器上,索引可能失效或者因爲頻繁操作而使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試着用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當數據庫表更新大量數據後,刪除並重建索引可以提高查詢速度。  


(1)在下面兩條select語句中:
  select * from table1 where field1<=10000 and field1>=0;
  select * from table1 where field1>=0 and field1<=10000;
  如果數據表中的數據field1都>=0,則第一條select語句要比第二條select語句效率高的多,因爲第二條select語句的第一個條件耗費了大量的系統資源。
  第一個原則:在where子句中應把最具限制性的條件放在最前面。


(2)在下面的select語句中:
  select * from tab where a=… and b=… and c=…;
  若有索引index(a,b,c),則where子句中字段的順序應和索引中字段順序一致。
  第二個原則:where子句中字段的順序應和索引中字段順序一致。


以下假設在field1上有唯一索引I1,在field2上有非唯一索引I2。
(3) select field3,field4 from tb where field1='sdf' 快
  select * from tb where field1='sdf' 慢,
因爲後者在索引掃描後要多一步ROWID表訪問。


(4) select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
因爲前者可以迅速定位索引。


(5) select field3,field4 from tb where field2 like 'R%' 快
  select field3,field4 from tb where field2 like '%R' 慢,
  因爲後者不使用索引。


(6) 使用函數如:
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
如果一個表有兩萬條記錄,建議不使用函數;如果一個表有五萬條以上記錄,嚴格禁止使用函數!兩萬條記錄以下沒有限制。


(7) 空值不在索引中存儲,所以
  select field3,field4 from tb where field2 is[not] null不使用索引。


(8) 不等式如
  select field3,field4 from tb where field2!='TOM'不使用索引。
  相似地,
  select field3,field4 from tb where field2 not in('M','P')不使用索引。


(9) 多列索引,只有當查詢中索引首列被用於條件時,索引才能被使用。


(10) MAX,MIN等函數,如
Select max(field2) from tb使用索引。所以,如果需要對字段取max,min,sum等,應該加索引。
一次只使用一個聚集函數,如:
select “min”=min(field1), “max”=max(field1) from tb   
不如:select “min”=(select min(field1) from tb) , “max”=(select max(field1) from tb)   


(11) 重複值過多的索引不會被查詢優化器使用。而且因爲建了索引,修改該字段值時還要修改索引,所以更新該字段的操作比沒有索引更慢。


(12) 索引值過大(如在一個char(40)的字段上建索引),會造成大量的I/O開銷(甚至會超過表掃描的I/O開銷)。因此,儘量使用整數索引。 Sp_estspace可以計算表和索引的開銷。


(13) 對於多列索引,order by的順序必須和索引的字段順序一致。


(14) 在sybase中,如果order by的字段組成一個簇索引,那麼無須做order by。記錄的排列順序是與簇索引一致的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章