今天同事的服務程序在執行批量插入數據操做時,會超時失敗,代碼debug了幾遍一點問題都沒有,SQL單條插入也能夠正常錄入數據,調試了一上午仍是很迷茫,場面一度很尷尬,最後仍是發現了問題的根本,原來是這個同事爲了提高查詢效率濫用了索引在搞鬼,沒有合理的運用索引使每次新增和修改數據時效率極低,大批量插入和修改數據時會使服務器超時。數據庫
因此我也簡單的對索引相關的知識簡單的作了一些總結,我查閱整理了一下在數據的管理中有以下可用的索引:
服務器
索引類型 描述
1,哈希:藉助於哈希索引,可經過內存中的哈希表來訪問數據。 哈希索引的內存用量固定不變,是存儲桶數量的函數。數據結構
2,內存優化非彙集索引: 對於內存優化的非彙集索引,內存使用量依賴於行計數以及索引鍵列的大小函數
3,羣集: 彙集索引基於彙集索引鍵按順序排序和存儲表或視圖中的數據行。 彙集索引按 B 樹索引結構實現,B 樹索引結構支持基於彙集索引鍵值對行進行快速檢索。性能
4,非彙集 :既可使用匯集索引來爲表或視圖定義非彙集索引,也能夠根據堆來定義非彙集索引。 非彙集索引中的每一個索引行都包含非彙集鍵值和行定位符。 此定位符指向彙集索引或堆中包含該鍵值的數據行。 索引中的行按索引鍵值的順序存儲,可是不保證數據行按任何特定順序存儲,除非對錶建立彙集索引。學習
5,惟一: 惟一索引確保索引鍵不包含重複的值,所以,表或視圖中的每一行在某種程度上是惟一的。惟一性能夠是彙集索引和非彙集索引的屬性。優化
6,columnstore: 內存中列存儲索引經過使用基於列的數據存儲和基於列的查詢處理來存儲和管理數據。列存儲索引適合於主要執行大容量加載和只讀查詢的數據倉庫工做負荷。 與傳統面向行的存儲方式相比,使用列存儲索引存檔可最多提升 10 倍查詢性能 ,與使用非壓縮數據大小相比,可提供多達 7 倍數據壓縮率 。spa
7,帶有包含列的索引: 一種非彙集索引,它擴展後不只包含鍵列,還包含非鍵列。 debug
8,計算列上的索引: 從一個或多個其餘列的值或某些肯定的輸入值派生的列上的索引。設計
9,篩選: 一種通過優化的非彙集索引,尤爲適用於涵蓋從定義完善的數據子集中選擇數據的查詢。 篩選索引使用篩選謂詞對錶中的部分行進行索引。 與全表索引相比,設計良好的篩選索引能夠提升查詢性能、減小索引維護開銷並可下降索引存儲開銷。
10,空間 :利用空間索引,能夠更高效地對幾何數據類型的列中的空間對象( 空間數據 )執行某些操做。 空間索引可減小須要應用開銷相對較大的空間操做的對象數。
11,XML: xml 數據類型列中 XML 二進制大型對象 (BLOB) 的已拆分持久表示形式。
12,全文: 一種特殊類型的基於標記的功能性索引,由 Microsoft SQL Server全文引擎生成和維護。 用於幫助在字符串數據中搜索複雜的詞。
不難看出要搞清楚全部索引,並靈活的去應用它其實並非一件容易的事情,不少索引咱們甚至都在工做中沒用過,甚至沒據說過,也不用擔憂,能夠先大體的瞭解它,能夠在須要實際用到時再去學習也不遲。
不過索引雖多,不用個個深刻學習,我的認爲搞懂彙集索引和非彙集索引的基本概念仍是頗有必要的,由於在實際的優化查詢,修改,插入等操做時,這兩個概念用的最多的,也是最基礎的
1,什麼是索引?
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。若是想按特定職員的姓來查找他或她,則與在表中搜索全部的行相比,索引有助於更快地獲取信息。最多見的索引就是書的目錄
2,如何理解彙集索引和非彙集索引
概念:
彙集索引是指數據庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。
非彙集索引是一種索引,該索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣。
上面是資料概念的概述,在講講我本身對彙集索引和非彙集索引的理解:
彙集索引最現實的能夠體現的例子就是字典的拼音查詢,通常咱們經常使用的中文字典會將字典的每一個字按照abcd...的拼音順序去排列,字典中的每個字比如是一條條數據,而字典最前面更具拼音查詢指定字的頁碼的小目錄就是索引,目錄拼音排序和實際數據順序是相同的,也就是所謂的數據庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。
那非彙集索引勒?非彙集索引其實最現實的體現也是字典,只不過換成了字典的部首查詢的體現,咱們看看部首查詢和拼音查詢有何區別,不難發現,從部首排序的角度去看,發現字典中字典中實際的字(實際數據)排列順序是沒有任何部首排列規則的,可是查詢部首的目錄(索引)都是按照指定的部首規則排序的,這樣的好處能夠在插入和更新的數據的時候沒必要從新排列數據,這就是所謂的索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣。
彙集索引和非彙集索引均可以優化查詢,我在此處只是淺顯的從,概念的角度去談對兩個簡單索引的理解,但願對你們有用,實際索引的原理仍是比較複雜的,須要深刻全部索引的原理我的建議仍是從數據結構入手
附:
-
羣集
-
彙集索引根據數據行的鍵值在表或視圖中排序和存儲這些數據行。 索引定義中包含彙集索引列。 每一個表只能有一個彙集索引,由於數據行自己只能按一個順序存儲。
-
只有當表包含彙集索引時,表中的數據行才按排序順序存儲。 若是表具備彙集索引,則該表稱爲彙集表。 若是表沒有彙集索引,則其數據行存儲在一個稱爲堆的無序結構中。
-
-
非彙集
-
非彙集索引具備獨立於數據行的結構。 非彙集索引包含非彙集索引鍵值,而且每一個鍵值項都有指向包含該鍵值的數據行的指針。
-
從非彙集索引中的索引行指向數據行的指針稱爲行定位器。 行定位器的結構取決於數據頁是存儲在堆中仍是彙集表中。 對於堆,行定位器是指向行的指針。 對於彙集表,行定位器是彙集索引鍵。
-
能夠向非彙集索引的葉級添加非鍵列以跳過現有的索引鍵限制,並執行完整範圍內的索引查詢。
-
彙集索引和非彙集索引均可以是惟一的。 這意味着任何兩行都不能有相同的索引鍵值。 另外,索引也能夠不是惟一的,即多行能夠共享同一鍵值。
每當修改了表數據後,都會自動維護表或視圖的索引。
彙集索引的缺點是對錶進行修改速度較慢,這是爲了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,下降了執行速度。非彙集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,彙集索引和非彙集索引都採用了B+樹的結構,但非彙集索引的葉子層並不與實際的數據頁相重疊,而採用葉子層包含一個指向表中的記錄在數據頁中的指針的方式。非彙集索引比彙集索引層次多,添加記錄不會引發數據順序的重組。