使用數據庫索引的利弊

優點:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構,

作爲通用規則,只有當經常查詢索引列中的數據時,才需要在表上創建索引。索引佔用磁盤空間,並且降低添加、刪除和更新行的速度。在多數情況下,索引用於數據檢索的速度優勢大大超過它的。

缺點:建立太多的索引將會影響更新和插入的速度,因爲它需要同樣更新每個索引文件。對於一個經常需要更新和插入的表格,就沒有必要爲一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。在某些情況下,建立索引的話也未必會快,例如索引放在一個不連續的存儲空間時,這會增加讀磁盤的負擔,因此,哪個是最優,應該通過實際的使用環境來檢驗。

對於邏輯結構的優化,還應將表數據和索引數據分開表空間存儲,分別使用獨立的表空間。因爲如果將表數據和索引數據放在一起,表數據的I/O操作和索引的I/O操作將產生影響系統性能的I/O競爭,降低系統的響應效率。將表數據和Oracle索引數據存放在不同的表空間中,並在物理層面將這兩個表空間的數據文件放在不同的物理磁盤上,就可以避免這種競爭了。

基礎知識:

        爲什麼索引會增加速度?通常數據庫的查詢方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對某一字段增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。大多數DB廠商實現索引都是基於一種數據結構——B樹,這種結果能夠大大提高查找速度。

根據數據庫的功能,可以在數據庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。有關數據庫所支持的索引功能的詳細信息,請參見數據庫文檔。

提示:儘管唯一索引有助於定位信息,但爲獲得最佳性能結果,建議改用主鍵唯一約束

唯一索引

唯一索引是不允許其中任何兩行具有相同索引值的索引。

當現有數據中存在重複的鍵值時,大多數數據庫不允許將新創建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創建重複鍵值的新數據。

主鍵索引

數據庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱爲表的主鍵。

在數據庫關係圖中爲表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。

聚集索引

在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。

如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。

創建索引

最普通的情況,是爲出現在where子句的字段建一個索引。爲方便講述,先建立一個如下的表。

CREATETABLEmytable(
 idserialprimarykey,
 category_idintnotnulldefault0,
 user_idintnotnulldefault0,
 adddateintnotnulldefault0
);

如果在查詢時常用類似以下的語句:

SELECT * FROM mytable WHERE category_id=1;

最直接的應對之道,是爲category_id建立一個簡單的索引:

CREATE INDEX mytable_categoryid ON mytable (category_id);

OK.如果有不止一個選擇條件呢?例如:

SELECT * FROM mytable WHERE category_id=1 AND user_id=2;

第一反應可能是,再給user_id建立一個索引。不好,這不是一個最佳的方法。可以建立多重的索引。

CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

建立合適索引需要考慮的因素:

總的來說,索引建立之前需要結合實際應用和數據分佈進行分析再分析,通常會考慮下面幾點

  1. 結合實際的應用。
  2. 考慮索引列的數據分佈,如果distinct值很少且數據分佈均勻的話,可能就不適合放在聯合索引的最前面。
  3. 考慮索引的大小,在字段長度32的列和長度爲7的列上建立索引大小肯定是不一樣的,索引越大掃描的代價就越高。
  4. 考慮索引列冗餘,可能你在索引中多冗餘一個小字段,select就只走索引而不需要去掃描原表的數據。
  5. 考慮索引對其他sql的影響,是否其他的sql也可以使用這個索引。
  6. 考慮對是否可以對原有索引進行合併,評估合併會有多大的影響。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章