1. 程式人生 > >建立索引原則及SQL新增索引

建立索引原則及SQL新增索引

一、資料庫建立索引的原則 

1.確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。 

2.嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,為那些頻繁在where子句中出現的欄位建立索引。 

3.嘗試建立複合索引來進一步提高系統性能。修改複合索引將消耗更長時間,同時,複合索引也佔磁碟空間。 

4.對於小型的表,建立索引可能會影響效能 

5.應該避免對具有較少值的欄位進行索引。 

6.避免選擇大型資料型別的列作為索引。 

A.mysql索引建立的原則 

索引查詢是資料庫中重要的記錄查詢方法,要不要進入索引以及在那些欄位上建立索引都要和實際資料庫系統的查詢要求結合來考慮,下面給出實際中的一些通用的原則: 

1. 在經常用作過濾器的欄位上建立索引; 

2. 在SQL語句中經常進行GROUP BY、ORDER BY的欄位上建立索引; 

3. 在不同值較少的欄位上不必要建立索引,如性別欄位; 

4. 對於經常存取的列避免建立索引; 

5. 用於聯接的列(主健/外健)上建立索引; 

6. 在經常存取的多個列上建立複合索引,但要注意複合索引的建立順序要按照使用的頻度來確定; 

7. 預設情況下建立的是非簇集索引,但在以下情況下最好考慮簇集索引,如:含有有限數目(不是很少)唯一的列;進行大範圍的查詢;充分的利用索引可以減少表掃描I/0的次數,有效的避免對整表的搜尋。當然合理的索引要建立在對各種查詢的分析和預測中,也取決於DBA的所設計的資料庫結構。 

B.oracle 索引建立的若干原則 

       我們首先要考慮的是資料量,資料量級別的不同,要考慮的問題有很大區別。幾千條記錄建不建索引其實都無所謂了,差個幾豪秒也感覺不出來,但資料量一旦要增長到百萬, 千萬級別,索引的重要性就體現出來了。沒有索引一個查詢可能要幾個小時甚至幾天才能出來,對資料庫的影響不僅僅是查詢速度的降低, 在io 上的花費和對資料庫連線資源的佔用甚至會拖跨資料庫。那麼怎樣建立索引,建立什麼型別的索引呢,應該按照幾個方面來考慮。 

1. 先要了解業務需求,總結出應用會按照哪幾個欄位來進行查詢。例如一個人員查詢系統可能會按照(姓名,身份證件號碼,性別,住址,民族等),當然可能是幾個欄位的組合查詢。 

2. 確定了第一步後要估計資料的分佈。相同值有多少,是不是均勻。如姓名欄位就會有大量的重複情況;性別可能只有兩個值(1,2 分別代表男,女),民族會有56 個。 

3. 確定索引的型別。選擇性高的欄位建立B- 樹索引最好,如果資料量太大,可考慮把索引分割槽,在併發情況下通常會表現很好。相當於把一棵很大的B樹拆開成了多棵小樹。只有幾個值的欄位如性別並且資料分佈比較均勻,查詢的平均命中率要是非常高就不需要建立索引,否則可以建立點陣圖索引(但會影響併發)。 

oracle建立索引原則 

1.索引需要平衡query和DML的需要,常用於(子)查詢的表應建立索引; 
2.把索引建到不同的表空間中; 
3.用統一的extent大小; 
4.五個block的倍數或者tablespace指定的MINIMUM EXTENT的倍數; 
5.建立索引考慮用NOLOGGING引數,重建索引的時候也一樣; 
6.建立索引時INITRANS值應該比相應的table的值高一些; 
7.對常用SQL語句的where條件中的列建立唯一索引或組合索引,組合條件查詢中相應的組合索引更有效; 
8.對於組合索引,根據列的唯一值概率,安排索引順序; 
9.如果一個列具有很低的資料基數,並且或者可具有空值,不應作為索引列; 
10.如果where語句中不得不對查詢列採用函式查詢,如upper函式,最好建立相應函式索引; 
11.對於低基數集的列,幷包含OR等邏輯運算,考慮用Bitmap索引,對於從大量行的表中返回大量的行時也可以考慮Bitmap索引; 
12.避免在有大量併發DML運算的表中使用Bitmap索引;

二、使用CREATE 語句建立索引

CREATE INDEX index_name ON table_name(column_name,column_name) include(score)

普通索引

CREATE UNIQUE INDEX index_name ON table_name (column_name) ;

非空索引

CREATE PRIMARY KEY INDEX index_name ON table_name (column_name) ;

主鍵索引
 
使用ALTER TABLE語句建立索引

alter table table_name add index index_name (column_list) ;
alter table table_name add unique (column_list) ;
alter table table_name add primary key (column_list) ;


刪除索引

drop index index_name on table_name ;
alter table table_name drop index index_name ;
alter table table_name drop primary key ;