索引是什麼html
數據庫中的索引相似於一本書的目錄,在一本書中使用目錄能夠快速找到你想要的信息,而不須要讀徹底書。在數據庫中,數據庫程序使用索引能夠快速查詢到表中的數據,而沒必要掃描整個表。書中的目錄是一個字詞以及各字詞所在的頁碼列表,數據庫中的索引是表中的值以及各值存儲位置的列表。數據庫
例如:數據庫中有20000條記錄,如今要執行這樣一個查詢:SELECT * FROM tableName WHERE num=10000。若是沒有索引,必須遍歷整個表,直到num=10000的這一行爲止;若是在num列上建立索引,SQL Server不須要任何掃描,直接在索引裏面找10000,就能夠得知這一行的位置。可見,索引的創建能夠加快數據的查詢速度。ide
不一樣數據庫中提供了不一樣的索引類型,SQL Server中的索引有兩種:彙集索引和非彙集索引。它們的區別是在物理數據的存儲方式上。性能
沒有彙集索引的數據表都稱爲堆表。即便上面有非彙集索引,也仍是堆表。ui
彙集索引基於數據行的鍵值,在表內排序和存儲這些數據行。每一個表只能有一個彙集索引,由於數據行自己只能按一個順序存儲。spa
彙集索引的全部的數據都存儲在葉子節點上,數據查詢的複雜度都是同樣的(樹的深度),按照彙集索引列查找數據效率是很是高的。.net
上面說了,彙集索引決定了表的物理存儲結構,那若是沒有建立彙集索引,會如何呢?設計
表內的全部頁都無序存放,是一個無序的堆結構。堆數據的查詢就會形成表掃描,性能是很是低的。指針
所以彙集索引的的重要性不言而喻,通常來講,大多會對主鍵創建彙集索引,大多數普通狀況這麼作也能夠。code
但實際應用應該尊從一個原則就是「頻繁使用的、排序的字段上建立彙集索引」
提示:SQL Server中,一個表只能建立1個彙集索引,多個非彙集索引。設置某列爲主鍵,該列就默認爲彙集索引。
非彙集索引就至關於使用字典的部首查找,非彙集索引是邏輯上的連續,物理存儲並不連續。
PS:彙集索引一個表只能有一個,而非彙集索引一個表能夠存在多個。
除了彙集索引之外的其餘索引,都稱之爲非彙集索引。一般,設計非彙集索引是爲了改善常用的、沒有創建彙集索引的查詢的性能。
建立惟一非彙集索引
CREATE UNIQUE INDEX ProviderInfo_Id_uindex ON dbo.ProviderInfo(Id)
非彙集索引也是B樹(B+樹和B-樹)的結構,與非彙集索引的存儲結構惟一不同的,就是非彙集索引中不存儲真正的數據行。
彙集索引中已經存放了全部數據,非彙集索引只包含一個指向數據行的指針便可。
非彙集索引的建立會單首創建索引文件來存儲索引結構,會佔用必定存儲空間,就是用空間換時間;
非彙集索引的目的很單純:提升特定條件的查詢效率,一個表有可能根據多種查詢需求建立多個非彙集索引;
彙集索引與非彙集索引
在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引,默認是主鍵列,彙集索引一般提供更快的數據訪問速度。
非彙集索引能夠有多個,物理順序與鍵值的邏輯(索引)順序能夠不相同。一個簡單的例子:對一個教室的學生,每一個人都有一個座位號(座位是物理存在的,只有一種排序,這就是彙集索引),咱們能夠按學生的年齡、身高、體重排序(這樣排出來的順序座號不連續即物理上不連續,在邏輯上是連續的,就是非彙集索引)
每一行的索引值都是惟一的(建立了惟一約束,系統將自動建立惟一索引)
5.列式存儲索引
列存儲索引是SQL Server 2012中爲提升數據查詢的性能而引入的一個新特性,顧名思義,數據以列的方式存儲在頁中,不一樣於彙集索引、非彙集索引及堆表等以行爲單位的方式存儲。
什麼是包含列?
所謂的包含列就是包含在非彙集索引中,而且不是索引列中的列。或者說的更通俗一點就是:把一些底層數據表的數據列包含在非彙集索引的索引頁中,而這些數據列又不是索引列,那麼這些列就是包含列。同時,這些包含列並不會對索引中的條目有影響。
爲何要建立帶有包含列的索引?
把須要用到的字段放到包含索引中(在返回的索引中就包含了一切),不用再查物理表,能夠達到最優的速度。
何時須要創建帶有包含列的索引,何時不須要創建帶有包含列的索引?
其實把一些列做爲包含列放在索引結構中就是一種用「空間換時間」的策略。
這個時候,你們可能就會問了:「何須把列放在包含列中這麼麻煩,爲何不直接放在索引中?」。
其實把那三個列放在包含列而不是索引列中有如下幾個好處:
總結:如何把一些列做爲包含列放在索引中,那麼就能夠在必定的程度上面提高效率,能夠把本來須要整表掃描的操做,改成非彙集索引掃描,這樣的成本更小。
字段上只有【男】或【女】兩個不一樣值,所以就無需創建索引,若是創建索引,不但不會提升查詢效率,反而會嚴重下降更新速度。
在頻繁進行排序或分組(即進行GROUP BY 或ORDER BY操做)的列上創建索引,若是待排序的列有多個,能夠在這些列上創建組合索引。
前面說過了,索引在使用一段時間後(主要是新增、修改、刪除數據,若是該頁已經存儲滿了,就要進行頁的拆分,頻繁的拆分,會產生較多的索引碎片)會產生索引碎片,這就形成了索引頁在磁盤上存儲的不連續。
在表上建立一個惟一的索引。惟一的索引意味着兩個行不能擁有相同的索引值。
CREATE UNIQUE INDEX ProviderInfo_Id_uindex ON dbo.ProviderInfo(Id)
https://www.cnblogs.com/knowledgesea/p/3672099.html
https://www.cnblogs.com/selene/p/4474721.html
https://blog.csdn.net/zc474235918/article/details/50580639