索引的簡單使用說明:
一.常用掃描方式:
.全表掃描
全表掃描就是順序地訪問表中每條記錄.
.索引掃描
索引唯一掃描(index unique scan)
索引范圍掃描(index range scan)
索引全掃描(index full scan)
索引快速掃描(index fast full scan)
1.索引唯一掃描(index unique scan)
通過唯一索引查找一個數值經常返回單個ROWID。如果該唯一索引有多個列組成(即組合索引),則至少要有組合索引的引導列參與到該查詢中,如創建索引:create index index_test on building(name,status)。
如:語句:
select id from building where name='國際科技大廈'
此語句可以使用該索引。如果該語句只返回一行,則存取方法稱為索引唯一掃描。
而語句:
select name from building where status ='1'
因為where條件沒有用到索引的引導列。所以索引不生效。
2.索引范圍掃描(index range scan)
使用一個索引存取多行數據,同上面一樣,如果索引是組合索引
如:select id from building where name like 'H%' and status='1' 語句返回多行數據,此時的存取方法稱為索引范圍掃描。
使用index rang scan的3種情況:
(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)
(b) 在組合索引上,只使用部分列進行查詢,導致查詢出多行
(c) 對非唯一索引列上進行的任何查詢。
3. 全索引掃描(index full scan)
SQL請求的全部列(column)必須駐留在索引樹中;也就是說,SELECT和WHERE字句中的所有數據列必須存在于索引中。并且排序返回。
4.索引快速掃描(index fast full scan)
掃描索引中的所有的數據塊,與 index full scan很類似,但是一個顯著的區別就是它不對查詢出的數據進行排序,即數據不是以排序順序被返回。
二.什么情況下應該建立索引
1.表的主關鍵字(建立唯一索引)
2.表的字段唯一約束
3.直接條件查詢的字段,在SQL中用于條件約束的字段
4.查詢中與其它表關聯的字段,字段常常建立了外鍵關系
5.查詢中排序的字段
6.查詢中統計或分組統計的字段
三.什么情況下應不建或少建索引
1.表的記錄很少
2.對一些經常處理的業務表應在查詢允許的情況下盡量減少索引
3.數據重復且分布平均的表字段
假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數據庫的查詢速度
四.索引應用注意事項
1. IS NULL 與 IS NOT NULL
不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。 任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。
2.帶通配符(%)的like語句
如: select * from building where name like '%中心%'
name為building表的索引,則此索引就不會生效,這里由于通配符(%)在搜尋詞首出現,通配符如此使用會降低查詢速度。然而當通配符出現在字符串其他位置時,優化器就能利用索引
select * from building where name like '&中心%'
3. Order by語句
ORDER BY語句決定了如何將返回的查詢結果排序,任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度。order by后面的排序字段盡量使用索引字段。
4.'<>'的用法
例如:
select * from building where id<>5000;
select * from building where id>5000 or id<5000
結果一樣,但是第二句id索引生效。
5.可以使用外部連接優化not in子句,例如:
select name from building where fk_building in (select deptid from test where name='test' and ifdeleted=0);
改為:
select name from building a,test b where a.fk_building=b.id and b.name='test' and ifdeleted=0;
6.索引列是否函數的參數。如是,索引在查詢時用不上。
7.主從表關聯方式
如果:building.id上有一索引
在district.id上有索引
如:
select contract_code from building a,district b where a.id=b.id
building.id上的索引就會生效
反之同理。
8.是否存在潛在的數據類型轉換。如將字符型數據與數值型數據比較,ORACLE會自動將字符型用to_number()函數進行轉換,從而導致上一種現象的發生。
9.索引應用的優先級;
(1).唯一性索引的等級高于非唯一性索引. 這個規則只有當WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在優化器中的等級是非常低的.
(2).如果多個索引在一個查詢中都可應用,那么如果條件中應用索引和常量進行比較,那么這個索引先被利用。
10.語句的執行計劃中有不良索引時,可以人為地屏蔽該索引,方法:
。數值型:在索引字段上加0,例如
select * from building where id+0 = 0;
。字符型:在索引字段上加‘’,例如
select * from building where name||’’='test';