索引

該文章來源於網頁整理.web

 

1.查看目前已經創建的索引數據庫

在同一張表上能夠有多個索引,經過查詢數據字典視圖dba_indexs和user_indexs,能夠顯示索引信息。其中dba_indexs用於顯示數據庫全部的索引信息,而user_indexs用於顯示當前用戶的索引信息
select index_name from all_indexes where table_name = ‘PICTURE’; 表名必須大寫服務器

create index picture_album_idx on picture (aid);  數據結構

按照數據存儲方式,能夠分爲B*樹、反向索引、位圖索引; 
按照索引列的個數分類,能夠分爲單列索引、複合索引; 
按照索引列值的惟一性,能夠分爲惟一索引和非惟一索引。 
此外還有函數索引,全局索引,分區索引... ide

對於索引我還要說: 
在不一樣的狀況,咱們會在不一樣的列上創建索引,甚至創建不一樣種類的索引。B*樹索引創建在重複值不多的列上,而位圖索引則創建在重複值不少、不一樣值相對固定的列上。函數


2.
能夠說,一張沒有索引的數據表,就像一個只有書櫃而沒有索引卡片櫃的圖書館,書庫裏面塞滿了一堆亂七八糟的圖書。當讀者對管理員提交查詢請求後,管理員就一頭鑽進書庫,對照查找內容從頭開始一架一櫃的逐本查找。運氣好的話,在第一個書架的第一本書就  找到了,運氣很差的話,要到最後一個書架的最後一本書才找到。能夠說,一張沒有索引的數據表,就像一個只有書櫃而沒有索引卡片櫃的圖書館,書庫裏面塞滿了一堆亂七八糟的圖書。當讀者對管理員提交查詢請求後,管理員就一頭鑽進書庫,對照查找內容從頭開始一架一櫃的逐本查找。運氣好的話,在第一個書架的第一本書就  找到了,運氣很差的話,要到最後一個書架的最後一本書才找到。工具


 若是咱們在創建非彙集索引以前先創建了彙集索引的話,那麼非彙集索引就可使用匯集索引的關鍵字進行檢索。
在只創建了非彙集索引的狀況下,每一個葉級節點指明瞭記錄的行定位符(RID);而在既有彙集索引又有非彙集索引的狀況下,每一個葉級節點所指向的是該彙集索引的索引鍵值,即數據記錄自己。 優化


  這就徹底和咱們在「索引的基本概念」中講到的現實場景徹底同樣了,當數據發生更新的時候,SQLS只負責對彙集索引的鍵值加以維護,而沒必要考慮非彙集索引。只要咱們在ID類的字段上創建彙集索引,而在其它常常須要查詢的字段上創建非彙集索引,經過這種科學的、有針對性的在一張表上分別創建彙集索引和非彙集索引的方法,咱們既享受了索引帶來的靈活與快捷,又相對避免了維護索引所致使的大量的額外資源消耗。 spa


在建立索引時,能夠爲這個索引指定一個填充因子,以便在索引的每一個葉級頁面上保留必定百分比的空間,未來數據能夠進行擴充和減小頁分裂。指針

只有在表中根據現有數據建立新索引,而且能夠預見未來會對這些數據進行哪些更改時,設置填充因子纔有意義。

 

右擊Northwind數據庫→單擊「屬性」→選擇「Options」選項卡,觀察「Settings」下的各項複選項:
從Settings中咱們能夠看到,在數據庫中,SQLS將默認的自動建立和更新統計信息,這些統計信息包括數據密度和分佈信息,正是它們幫助SQLS肯定最佳的查詢策略:創建查詢計劃和是否使用索引以及使用什麼樣的索引。

索引的兩個重要屬性----唯一性索引和複合性索引:
若是表中已經有一個主鍵約束或者唯一性約束,那麼當建立表或者修改表時,SQLS自動建立一個唯一性索引.


索引能夠分爲簇索引和非簇索引,簇索引經過重排表中的數據來提升數據的訪問速度,而非簇索引則經過維護表中的數據指針來提升數據的索引。


3.

索引是數據庫中重要的數據結構,它的根本目的就是爲了提升查詢效率。如今大多數的數據庫產品都採用IBM最早提出的ISAM索引結構。

 

●在常常進行鏈接,可是沒有指定爲外鍵的列上創建索引,而不常常鏈接的字段則由優化器自動生成索引。 
●在頻繁進行排序或分組(即進行group by或order by操做)的列上創建索引。 
●在條件表達式中常常用到的不一樣值較多的列上創建檢索,在不一樣值少的列上不要創建索引。好比在僱員表的「性別」列上只有「男」與「女」兩個不一樣值,所以就無必要創建索引。若是創建索引不但不會提升查詢效率,反而會嚴重下降更新速度。 
●若是待排序的列有多個,能夠在這些列上創建複合索引(compound index)。 
●使用系統工具。如Informix數據庫有一個tbcheck工具,能夠在可疑的索引上進行檢查。在一些數據庫服務器上,索引可能失效或者由於頻繁操做而使得讀取效率下降,若是一個使用索引的查詢不明不白地慢下來,能夠試着用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當數據庫表更新大量數據後,刪除並重建索引能夠提升查詢速度。

EG.

(1)在下面兩條select語句中:
   select * from table1  where  field1<=10000 and field1>=0;
   select * from table1  where  field1>=0 and field1<=10000;
   若是數據表中的數據field1都>=0,則第一條select語句要比第二條select語句效率高的多,由於第二條select語句的第一個條件耗費了大量的系統資源。
   第一個原則:在where子句中應把最具限制性的條件放在最前面。

(2)在下面的select語句中:
   select * from tab  where  a=… and b=… and c=…;
  如有索引index(a,b,c),則where子句中字段的順序應和索引中字段順序一致。
   第二個原則:where子句中字段的順序應和索引中字段順序一致。

如下假設在field1上有惟一索引I1,在field2上有非惟一索引I2。
(3) select field3,field4 from tb where field1='sdf'        快
    select * from tb where field1='sdf'      慢,
由於後者在索引掃描後要多一步ROWID表訪問。

(4) select field3,field4 from tb where field1>='sdf'        快
select field3,field4 from tb where field1>'sdf'        慢
由於前者能夠迅速定位索引。

(5) select field3,field4 from tb where field2 like 'R%'    快
    select field3,field4 from tb where field2 like '%R'    慢,
    由於後者不使用索引。

(6) 使用函數如:
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
若是一個表有兩萬條記錄,建議不使用函數;若是一個表有五萬條以上記錄,嚴格禁止使用函數!兩萬條記錄如下沒有限制。

(7) 空值不在索引中存儲,因此
    select field3,field4 from tb where field2 is[not] null不使用索引。

(8) 不等式如
    select field3,field4 from tb where field2!='TOM'不使用索引。
    類似地,
    select field3,field4 from tb where field2 not in('M','P')不使用索引。


(9) 對於多列索引,order by的順序必須和索引的字段順序一致。


4.
創建索引後,並非每一個查詢都會使用索引,只要咱們在查詢語句中沒有強制指定索引,索引的選擇和使用方法是SQLSERVER的優化器自動做的選擇,而它選擇的根據是查詢語句的條件以及相關表的統計信息,這就要求咱們在寫SQL語句的時候儘可能使得優化器可使用索引。爲了使得優化器能高效使用索引,寫語句的時候應該注意:

A、不要對索引字段進行運算,而要想辦法作變換
SELECT ID FROM T WHERE NUM/2=NUM1    若是NUM有索引應改成:    SELECT ID FROM T WHERE NUM=NUM1*2

B、 不要對索引字段進行格式轉換
C、 不要對索引字段使用函數
D、不要對索引字段進行多字段鏈接


多表鏈接的鏈接條件對索引的選擇有着重要的意義,因此咱們在寫鏈接條件條件的時候須要特別注意。

  A、多表鏈接的時候,鏈接條件必須寫全,寧肯重複,不要缺漏。

  B、鏈接條件儘可能使用匯集索引

  C、注意ON、WHERE和HAVING部分條件的區別

考慮聯接優先順序:(1)INNER JOIN(2)LEFT JOIN (注:RIGHT JOIN 用 LEFT JOIN 替代)(3)CROSS JOIN

在IN後面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最後面,減小判斷的次數

相關文章
相關標籤/搜索