1. 建立sql索引應該遵循什麼原則
索引是建立在資料庫表中的某些列的上面。因此,在創建索引的時候,應該 仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列上創建索引,例如:在經常需要搜索的列上,可以加快搜索的速度;在作為 主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經常需要根據范圍進行搜索 的列上創建索引,因為索引已經排序,其指定的范圍是連續的;在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢 時間;在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。
同樣,對於有些列不應該創建索引。一般來說,不應該創建索引的的 這些列具有下列特點:第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查 詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。第二,對於那些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的 取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加 快檢索速度。第三,對於那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。第四,當修改性能遠遠大於檢索性能時,不應該創建索 引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因 此,當修改性能遠遠大於檢索性能時,不應該創建索引。
創建索引的方法和索引的特徵
2. 試列舉何種情況考慮創建索引,在SQL中
轉:
---使用索引優化資料庫查詢效率
1.不宜創建索引的情形
(1)經常插入,修改和刪除的表
(2)數據量比較小的表,因為查詢優化器在搜索索引時所花費的時間可能會大於遍歷全表的數據所需要的時間
2.適合創建索引的情形
(1)為where子句中出現的列創建索引
(2)創建組合索引
(3)為group by 子句中出現的列創建索引
3.聚集索引的設計原則
(1)該列的數值是唯一的或者很少有重復的記錄
(2)經常使用between ...and..按順序查詢的列
(3)定義identity的唯一列.
(4)經常用於對數據進行排序的列.
---無法使用索引的select語句
1.對索引列使用了函數,如:
select * from tb where max(id)=100
2.對索引列使用了'%xx',如:
select * from tb where id like '%1'
需要注意的不是所有使用like關鍵字的select 語句都無法使用索引,比如
select * from tb where id like '1%'就可以使用索引
3.在where子句中對列進行類型轉換(其實也是使用到了函數)
4.在組合索引的第1列不是使用最多的列,如在下面3個查詢語句中建立組合索引,按順序包含col2,col1,id列;
select * from tb where id='1' and col1='aa'
select id,sum(col1) from tb group by id
select * from tb where id='2' and col2='bb'
則第一句和第二句無法使用到索引 所以需要注意組合索引的順序
5.在where 子句中使用in關鍵字的某些句子
當在in關鍵字後面使用嵌套的select語句,將無法使用在該列上定義的索引
如:
select
*
from
ta
where
id
in
(select id from tb where ....)
--這樣可以用到索引
select * from tb where id in('1','2')