索引相似於字典的目錄,用於快速定位到你要查找的數據,這樣你就不用一頁一頁去查找,提升了查詢性能。索引的基本目的是在大量數據中找尋少許數據,把查詢語句所須要的少許數據添加到索引分頁中,這樣訪問數據時只要訪問少數索引的分頁就能夠找到須要的數據了。例如:數據庫中有20000條記錄,如今要執行這樣一個查詢: SELECT * FROM tableName WHERE num=10000。若是沒有索引,必須遍歷整個表,直到num=10000的這一行爲止;若是在num列上建立索引,SQL Server不須要任何掃描,直接在索引裏面找10000,就能夠得知這一行的位置。可見,索引的創建能夠加快數據的查詢速度數據庫
可是索引對於提升查詢性能也不是萬能的,也不是創建越多的索引就越好。索引建少了,用WHERE子句找數據效率低,不利於查找數據。索引建多了,不利於新增、修改和刪除等操做,由於作這些操做時,SQL SERVER除了要更新數據表自己,還要連帶地當即更新全部的相關索引,並且過多的索引也會浪費硬盤空間。索引字段的值重複性越低越好,用來做索引的數據域鍵值愈小愈好,這樣分頁就能夠存更多的鍵值記錄性能
微軟的SQL SERVER提供了兩種索引:彙集索引(clustered index,也稱聚類索引、簇集索引)和非彙集索引(nonclustered index,也稱非聚類索引、非簇集索引)優化
彙集索引:典型的就是新華字典的正文就是一個彙集索引。正文自己就是按照必定的順序排列的,例如我查 「微」,很天然的就從最前面翻到以字幕w開頭的地方開始查詢,直到w開頭的查找結束,若是沒有,則這個字就沒有被收錄。咱們把這種正文內容自己就是一種按照必定規則排列的目錄稱爲「彙集索引」。彙集索引指的是數據表自己就是索引的一部分,數據表自己就是彙集索引的子葉層,整個數據表的擺放順序是按照你選定的鍵值由小到大排序(或由大到小),由於數據表內實際擺放數據的方式只能遵循一種順序,因此一個數據表只能有一個彙集索引,彙集索引的平均大小大約爲表大小的 5%左右spa
最重要的,最常被用戶做爲查詢,排序條件的適合創建彙集索引,在創建彙集索引以後,SQL SERVER會從新組織數據頁,讓其中的數據行按照彙集索引中鍵值的順序存儲設計
非彙集索引:
若是您碰到一個不認識的字,不知道它的發音,這時候須要去根據「偏旁部首」在檢字表中查到您要找的字,而後根據這個字後的頁碼直接翻到某頁來找到您要找的字。它須要兩個過程,先找到目錄中的結果,而後 再翻到您所須要的頁碼。咱們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱爲「非彙集索引。
非彙集索引是徹底獨立於數據表以外的結構,因此不會影響數據行的順序,非彙集索引具備徹底獨立於數據行的結構,使用非彙集索引不用將物理數據頁中的數據按列排序,非彙集索引包含索引鍵值和指向表數據存儲位置的行定位器。能夠對錶或索引視圖建立多個非彙集索引。一般,設計非彙集索引是爲了改善常用的、沒有創建彙集索引的查詢的性能。
查詢優化器在搜索數據值時,先搜索非彙集索引以找到數據值在表中的位置,而後直接從該位置檢索數據。這使得非彙集索引成爲徹底匹配查詢的最佳選擇,由於索引中包含搜索的數據值在表中的精確位置的項。
具備如下特色的查詢能夠考慮使用非彙集索引:
(1).使用JOIN或者GROUP BY子句,應爲鏈接和分組操做中所涉及的列建立多個非彙集索引,爲任何外鍵建立一個彙集索引.
(2).包含大量惟一值的字段。
(3).不返回大型結果集的查詢。建立篩選索引以覆蓋從大型表中返回定義完善的的行子集的查詢。
(4).常常包含在查詢的搜索條件(如返回徹底匹配的WHERE子句)中的列。code
索引設計不合理或者缺乏索引都會對數據庫和應用程序的性能形成障礙,高效的索引對於得到良好的性能很是重要。設計索引時,應該考慮如下原則:
(1).索引並不是越多越好,一個表中若是有大量的索引,不只佔用大量的磁盤空間,並且會影響INSERT、DELETE、UPDATE等語句的性能。由於當表中數據更改的同時,索引也會進行調整和更新。
(2).避免對常常更新的表進行過多的索引,而且索引中的列儘量少。而對常常用於查詢的字段應該建立索引,但要避免添加沒必要要的字段。
(3).數據量小的表最好不要使用索引,因爲數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
(4).在條件表達式中常常用到的、重複數據較少的列上創建索引,重複數據較多的列上不要創建索引、好比在學生表的【性別】字段上只有【男】或【女】兩個不一樣值,所以就無需創建索引,若是創建索引,不但不會提升查詢效率,反而會嚴重下降更新速度。
(5).當惟一性是某種數據自己的特徵時,指定惟一索引,使用惟一索引可以確保定義的列的數據完整性,提升查詢速度。
(6).在頻繁進行排序或分組(即進行GROUP BY 或ORDER BY操做)的列上創建索引,若是待排序的列有多個,能夠在這些列上創建組合索引blog
其餘索引:索引視圖,全文索引,空間索引,篩選索引等排序
索引練習:索引
--索引 --建立teacher表 create database sample_db; CREATE TABLE teacher( t_id int IDENTITY(1,1), t_name varchar(20), t_phone varchar(11), t_gender char(2) ) --【例1】在teacher表中的t_phone列上,建立一個名稱爲Idx_phone的惟一彙集索引, --降序排列,填充因子爲30%,輸入語句以下: CREATE UNIQUE NONCLUSTERED INDEX Idx_phone ON teacher (t_phone DESC) WITH FILLFACTOR=30; --【例2】在teacher表中的t_name和t_gender列上,建立一個名稱爲Idx_nameAndgender的 --惟一非彙集組合索引,升序排列,填充因子爲10%。以下: CREATE UNIQUE NONCLUSTERED INDEX Idx_nameAndgender ON teacher(t_name,t_gender) WITH FILLFACTOR=10; --用系統存儲過程查看索引信息 USE sample_db; GO exec sp_helpindex 'teacher'; --查看索引統計信息 DBCC SHOW_STATISTICS ('sample_db.dbo.teacher',Idx_phone); --【例】將teacher表中的索引名稱Idx_nameAndgender更改成multi_index, --輸入以下: USE sample_db; GO exec sp_rename 'teacher.Idx_nameAndgender' ,'multi_index', 'index'; --【例】刪除表teacher中的索引 multi_index,以下: USE sample_db; GO exec sp_helpindex 'teacher' DROP INDEX teacher.multi_index exec sp_helpindex 'teacher';