合索引 與 單一列的索引

背景:目前WEB的普及太快,不少網站都會由於大流量的數據而發生服務器習慣性死機,一個查詢語句只能適用於必定的網絡環境.沒有優化的查詢當趕上大數據量時就不適用了.web

 

聯合索引使用結論:服務器

   1):查詢條件中出現聯合索引第一列,或者所有,則能利用聯合索引.網絡

   2):條件列中只要條件相連在一塊兒,以本文例子來講就是:測試

   last_name=’1′ and first_name=’1′大數據

   與優化

   first_name=’1′ and last_name=’1′網站

   ,不管先後,都會利用上聯合索引.spa

   3):查詢條件中沒有出現聯合索引的第一列,而出現聯合索引的第二列,或者第三列,都不會利用聯合索引查詢.orm

 

單一列索引的應用結論:索引

   1):只要條件列中出現索引列,不管在什麼位置,都能利用索引查詢.

 

二者的共同點:

   1):要想利用索引,都要符合SARG標準.

   2) :都是爲了提升查詢速度.

   3):都須要額外的系統開銷,磁盤空間.

   補充說明: stmtText信息來產生,在查詢語句前面加上:SET STATISTICS PROFILE on.能夠經過運行它,來觀察你的查詢是否合理,這樣才能真正作到優化.

 

本文主旨:討論什麼狀況下能利用上索引.

   索引:建立索引能夠根據查詢業務的不一樣分爲兩種:單一列的索引,聯合索引. 顧名思義,單一列索引就是指在表的某一列上建立索引,聯合索引是在多個列上聯合建立索引.

   優缺點比較:

   1):索引所佔用空間:單一列索引相對要小.

   2):索引建立時間:單一列索引相對短.

   3):索引對insert,update,delete的影響程序:單一列索引要相對低.

   4):在多條件查詢時,聯合索引效率要高.

   索引的使用範圍:單一列索引能夠出如今where 條件中的任何位置,而聯合索引須要按必定的順序來寫.

 

本文所用測試軟件環境以下:SQL05   

DEMO:建立一我的員表,包含人員ID,姓名.在人員ID上建立一個彙集索引,在first_name和last_name上建立一個聯合

索引.

create table person (id int, last_name varchar(30), first_name varchar(30))

create unique clustered index person_id on person (id)

create index person_name on person (last_name, first_name)

在上例中,id上建立了彙集索引,下面的查詢都會用了彙集索引.

   where id=1

   where id>1

   where id<1

   where id between 1 and n

   where id like ’1%’

   where id in(1,2,3…)

說明: id 列出如今條件中的位置並不必定要求第一列,不受位置影響.

   不過下面的查詢方式則不會用上彙集索引.

    where person_id +1=n

   where person_id like ‘%5′

    where person_id like ‘%5%’

   where person_id abs(15)

 聯合索引列比起單一列索引最大的好處在於,對於多條件的查詢它比起單一列索引更加精確.拿上面的人員表來講吧,若是

要查詢一我的的全名,只知道first_name是很難立刻找到這我的的全名的,若是知道first_name和last_name則會很是容易找到.

 

下面根據不一樣的條件與輸出列順序說明索引的應用.

第一種狀況:–條件和輸出列和索引列順序相同

select last_name,first_name from person where last_name=’1′ and first_name=’1′

stmtText

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]

AND [bdg_web_vaction].[dbo].[person].[first_name]=[@2]) ORDERED FORWARD)

   結果:利用person_name聯合索引查找

 

第二種狀況:–條件列與索引列順序不一樣,但輸出列相同

select last_name,first_name from person where first_name=’1′ and last_name=’1′

stmtText

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@2] AND [bdg_web_vaction].

[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)

   結果:利用person_name聯合索引查找

 

第三種狀況:–條件列與輸出列與索引列的順序都不相同

select first_name,last_name from person where first_name=’1′ and last_name=’1′

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].

 [last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)

   結果:利用person_name聯合索引查找

 

第四種狀況:–條件列在first_name和last_name中間加入另一個條件

SELECT id, first_name,last_name from person where first_name=’1′ AND id=1 and last_name=’1′

   Clustered Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_id]),

SEEK:([bdg_web_vaction].[dbo].[person].[id]=CONVERT_IMPLICIT(int,[@2],0)),

WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1] AND [bdg_web_vaction].[dbo].[person].[las

   結果:不能利用person_name聯合索引查找

 

第五種狀況:--在輸出列中分開first_name和last_name

SELECT first_name,id,last_name from person where first_name='1' and last_name='1'

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].

[last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1])

ORDERED FORWARD)

   結果:利用person_name聯合索引查找

 

第六種狀況:條件列沒有出現聯合索引的第一列

SELECT first_name,id,last_name from person where first_name=’1′

SELECT first_name,last_name from person where first_name=’1′

SELECT last_name ,first_name from person where first_name=’1′

Index Scan(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

   WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1]))

   結果:不能利用person_name聯合索引.

 

第七種狀況:–條件列出現聯合索引的第一列

SELECT first_name,id,last_name from person where last_name=’1′

SELECT first_name,last_name from person where last_name=’1′

SELECT last_name ,first_name from person where last_name=’1′

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]) ORDERED FORWARD)

   結果:利用person_name聯合索引查找

 

 

   聯合索引使用總結:

   1):查詢條件中出現聯合索引第一列,或者所有,則能利用聯合索引.

   2):條件列中只要條件相連在一塊兒,以本文例子來講就是:

   last_name=’1′ and first_name=’1′

   與

   first_name=’1′ and last_name=’1′

   ,不管先後,都會利用上聯合索引.

3):查詢條件中沒有出現聯合索引的第一列,而出現聯合索引的第二列,或者第三列,都不會利用聯合索引查詢.

   單一列索引的應用總結:

   1):只要條件列中出現索引列,不管在什麼位置,都能利用索引查詢.

   二者的共同點:

   1):要想利用索引,都要符合SARG標準.

   2) :都是爲了提升查詢速度.

   3):都須要額外的系統開銷,磁盤空間.

   補充說明: stmtText信息來產生,在查詢語句前面加上:SET STATISTICS PROFILE on.能夠經過運行它,來觀察你的查詢是否合理,這樣才能真正作到優化.

 

   總結:即便表上建立了索引,但若是查詢語句寫的不科學的話(不符合SARG標準),也於事無補,要根據表索引狀況來優化查詢語句,如沒有合適的索引可用,則要建立相應索引.

相關文章
相關標籤/搜索