一、 索引(INDEX)使用的問題
1. 索引(INDEX),用還是不用?這是個的問題。
是全表掃描還是索引范圍掃描主要考慮SQL的查詢速度問題。這裡主要關心讀取的記錄的數目。根據DONALD K .BURLESON的說法,使用索引范圍掃描的原則是:
對於數據有原始排序的表,讀取少於表記錄數40%的查詢應該使用索引范圍掃描。對讀取多於表記錄數40%的查詢應全表掃描。
對於未排序的表,讀取少於表記錄數7%的查詢應該使用索引范圍掃描,反之,對讀取多於表記錄數7%的查詢應全表掃描。
注:在不同的書中,對是否使用索引的讀取記錄的百分比值不太一致,基本上是一個經驗值,但是讀取記錄的百分比越低,使用索引越有效。
2. 如果列上有建索引,什麼SQL查詢是有用索引(INDEX)的?什麼SQL查詢是沒有用索引(INDEX)的?
存在下面情況的SQL,不會用到索引:
存在數據類型隱形轉換的,如:
select * from staff_member where staff_id=’123’;
列上有數學運算的,如:
select * from staff_member where salary*2<10000;
使用不等於(<> )運算的,如:
select * from staff_member where dept_no<>2001;
使用substr字符串函數的,如:
select * from staff_member where substr(last_name,1,4)=’FRED’;
‘%’通配符在第一個字符的,如:
select * from staff_member where first_name like ‘%DON’;
字符串連接(||)的,如:
select * from staff_member where first_name||’’=’DONALD’
3. 函數的索引
日期類型也是很容易用到的,而且在SQL語句中會使用to_char函數以查詢具體的的范圍日期。如:select * from staff_member where TO_CHAR(birth_day,’YYYY’)=’2003’; 我們可以建立基於函數的索引如:CREATE INDEX Ind_emp_birth ON staff_member (to_char((birth_day,’YYYY’));