背景:目前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標準),也於事無補,要根據表索引狀況來優化查詢語句,如沒有合適的索引可用,則要建立相應索引.