目錄
確定需要建立索引的列
主鍵列和唯一鍵列的索引
外來鍵列的索引
其他適合建立索引的列
索引指南
小結現在我們把注意力轉到應為哪些列建立索引上。對於初學者來說,我們建議對於大多數應用程式,在下列情況下建立索引。
為每個表定義主鍵約束:這導致在主鍵指定的列上自動建立索引。
在要求唯一且不同於主鍵列的列上建立唯一鍵約束:每個唯一鍵約束導致在約束中指定的列上自動建立乙個索引。
手動建立外來鍵列上的索引:這是為了得到更好的效能,以避免某些特定的鎖問題(有關完整的詳細資訊,請參閱第2章)。
在大多數情況下,應該為每個表建立主鍵約束。如果沒有為主鍵列定義索引,那麼oracle會自動為你建立乙個b樹索引。
同樣,對於在表上定義的任何唯一鍵約束,如果唯一鍵列上沒有已定義的索引,oracle也將建立乙個合適的b樹索引,如下面簡單的例子所示:
請參閱第2章,了解關於主鍵和唯一鍵約束的完整細節以及它們與索引的關係
oracle不會自動建立外來鍵列的索引。我們建議在外鍵列上建立b樹索引的原因之一是,外來鍵列經常在where子句中被引用,並因此可以改善這些查詢的效能。
當外來鍵列上存在索引時,可以避免或減少鎖定問題。也就是說,當插入或刪除子表中的記錄時,將在父表上放置乙個表級別的鎖,該鎖將阻止其他程序在父表中插入或刪除記錄。在oltp資料庫中,當有多個程序同時插入和刪除父表和子表中的記錄時,這可能會成問題。在資料倉儲環境中,這個問題的影響更小,因為資料以更加系統化的方式(排程批處理作業)被載入並且資料通常不會被刪除。
下面是乙個簡單的例子,首先建立乙個有外來鍵的表,然後手動建立索引:
在選擇建立什麼樣的索引時,請牢記這一基本原則:根據查詢表時使用的列制定索引策略。既可以在乙個表上建立多個索引,也可以建立乙個包含多個列的索引。如果事先考慮好需要在表上執行什麼型別的查詢,那麼就會做出更好的決策。如果你已經確定了效能較差的sql查詢,也可以考慮為符合以下條件的列建立索引。
為經常用作where子句中謂詞的列建立索引,如果在where子句中使用表的多個列,可以考慮使用組合(多列)索引。
為在select子句中使用的列建立覆蓋索引。
考慮為在order by、group by、union或者distinct子句中使用的列建立索引。
oracle允許建立包含多個列的索引。多列索引被稱為組合索引(有時也被稱為復合索引)。如果你訪問表時經常在where子句中使用多個列,那麼這些索引特別有效。在這種情況下,組合索引常常比分別建立多個單列索引更有效。
包含在select和where子句中的列也是索引的候選者。請記得,覆蓋索引包括查詢返回的所有列。在這種情況下,oracle可以使用索引結構本身(而不是表)來滿足查詢的結果。此外,如果列值有足夠的選擇性,oracle還可以使用where子句中引用的列的索引來提高查詢效能。
還應考慮為在group by、order by、union或distinct子句中使用的列建立索引。這可能會使經常使用這些sql構造的查詢更高效。
每個表上有多個索引沒有關係。但是,在乙個表上建立的索引越多,dml語句就會執行得越慢(因為表列值變化時,oracle有越來越多的索引需要維護)。不要在表中隨機新增索引,直到偶然發現索引列的正確組合,這是乙個陷阱。相反,需要在生產環境中建立索引之前,驗證它的效能。(關於驗證效能優勢的詳細資訊,請參閱第7章)。
注意 表中的一列允許在該錶的多個索引**現。然而,oracle並不允許在乙個表的完全相同的列組合上建立多個索引。
利用oracle索引有助於高效訪問大型資料集。只有確定了select語句在效能上的改進與索引所消耗的空間成本和更新表時的開銷相比是否值得,才能確定是否應該使用索引。表1-2概括了有效使用索引的準則。
表1-2 建立索引的準則
指南論證
建立所需數量的索引,但盡量少創
建索引。明智地新增索引。首先要
測試以確定可量化的效能收益
索引提高效能,但也消耗磁碟空間和
處理資源。不要新增不必要的索引
(續)指南論證
對錶執行的查詢所需的效能,
應該成為制訂索引策略的基礎
為在sql查詢中使用的列創
建索引將最大限度地提公升效能
考慮使用sql調優顧問或sql訪
問顧問獲得索引的建議
這些工具提供了建議和第二雙進
行索引決策的眼睛
為所有表建立主鍵約束
這將自動建立乙個b樹索引
(如果在主鍵列上還沒有建立索引)
在合適的地方建立唯一鍵約束
這將自動建立乙個b樹索引
(如果在唯一鍵列上還沒有建立索引)
為包含外來鍵的列建立索引
連線表時,外來鍵列通常包含在
where子句中,從而能提高sql select
語句的效能。在外鍵列上建立乙個b
樹索引,還可以減少在更新和插入
子表時的鎖定問題
小心地選擇和測試小表的
索引(小表少於幾千行)
即使對於小表,有時候訪問索引也
可能比全表掃瞄效能更好
使用正確的索引型別
正確使用索引能最大限度地提高效能。
如果不能證明使用不同型別
索引可獲得效能增益,那就使
用基本的b樹索引型別
對於大多數具有高基數列值的應用程
序,都適合使用b樹索引
資料倉儲環境中,考慮使用位圖索引
對不經常更新的低基數值列來說,
使用這些索引是理想選擇。點陣圖索
引適用於星型模式事實表的外來鍵列,
前提是經常會對事實表執行使用and
和or連線條件的查詢
考慮為索引使用單獨的
表空間(與表分離)
表和索引資料可能有不同的儲存、
備份和恢復要求。單獨的表空間,
可以把索引和表分開管理
讓索引從表空間繼承它的儲存屬性
這使得它更易於管理和維護索引的儲存
使用一致的命名標準
這使得維護和故障排除更容易
不要重建索引,除非有充
分的理由這樣做
重建索引通常是不必要的,除非索
引損壞或需要把索引移動到不同的表空間
監測索引,並刪除不被使用的索引
這樣做能釋放物理空間,並提高dml
(資料操縱語言)語句的效能
刪除索引之前,考慮把它標
記為不可用或不可見的
這使你在刪除索引之前,可以更好
地確定是否有任何效能問題。這些
選項使得可以重建或重新啟用
索引而無需用ddl(資料定義語言)來建立語句
在建立和管理資料庫中的索引時,請參考這些指導原則。這些建議是為了幫助你正確使用索引技術。
索引的存在主要是為了提高查詢效能,因此仔細考慮如何實現索引是至關重要的。精心設計的索引策略將會使資料庫應用程式的效能優異。相反,欠考慮的計畫將導致效能不佳。
索引占用磁碟空間,並與表分開存放。然而,索引定義在表的乙個或多個列上,從這個意義上說,索引不能脫離表而單獨存在。
oracle提供了廣泛的索引型別和功能。在大多數情況下,使用預設的b樹索引就可以了。使用其他型別的索引之前,請確保你了解效能收益。你應該知道oracle提供的索引有哪些功能,並知道在什麼樣的情況下,應該使用哪種專門的索引。
我們建議在主鍵列、唯一鍵列和外來鍵列上建立索引。這是個很好的起點。然後,對執行緩慢的sql語句進行分析,觀察會用到哪些列。這會為你提供額外的候選索引列。這些索引建議奠定了最大限度地提高sql查詢效能的基礎。
Mysql的列索引和多列索引(聯合索引)
建立乙個多列索引 create table test id int not null,last name char 30 not null,first name char 30 not null,primary key id index name last name,first name 建立多個索...
Mysql的列索引和多列索引(聯合索引)
建立乙個多列索引 create table test id int not null,last name char 30 not null,first name char 30 not null,primary key id index name last name,first name 建立多個索...
建立二級索引 索引 一 Mysql建立索引
假如,乙個 薄裡面包含了乙個城市的所有人的姓名和 號碼。那麼,想找到bob cat的 號碼,另外我們知道 簿中名字是按照字母順序排列的,所以首先要查詢姓氏為cat的頁面,然後在這個頁面下查詢名字為bob的 號碼。那如果在 薄中的名字沒有按照字母排列,就需要去瀏覽所有的頁,然後在裡面查詢每個姓名直到找...