SQL索引見解

2022-08-31 11:21:12 字數 1750 閱讀 8104

其實對於非專業的資料庫操作人員來講,例如軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的dba團隊,他們會幫助你優化sql,開發人員即使不懂優化問題也不大,所以開發人員對這方面也就不會下太多功夫去了解sql優化,但如果公司沒有這樣的dba呢,就只能靠程式設計師自己了。 最近突然想起前一陣和一朋友的聊天,當時他問我的問題是乙個非常普通的問題:說說sql聚集索引和非聚集索引的區別。

聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個,這個跟沒問題沒差別,一般人都知道。

聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續,這個大家也都知道。

上面的兩點從大的方面講都是講的通的,後面我們繼續**,舉乙個實際點的例子,乙個學生表student,裡面是學生號id,學生姓名,學生所在城市id,學生成績(總分)。

我自認為是對資料庫索引知識有一定研究的,但可能是有兩年沒實際接觸sql的原因,一時還真想不出具有說服力的解釋,朋友們看到這能解答我的問題嗎?

其實上面的我們需要搞清楚以下幾個問題:

第一:聚集索引的約束是唯一性,是否要求欄位也是唯一的呢?

分析:如果認為是的朋友,可能是受系統預設設定的影響,一般我們指定乙個表的主鍵,如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,sql會預設在此字段上建立乙個聚集索引,而主鍵都是唯一的,所以理所當然的認為建立聚集索引的字段也需要唯一。

結論:聚集索引可以建立在任何一列你想建立的字段上,這是從理論上講,實際情況並不能隨便指定,否則在效能上會是惡夢。

第二:為什麼聚集索引可以建立在任何一列上,如果此表沒有主鍵約束,即有可能存在重複行資料呢?

粗一看,這還真是和聚集索引的約束相背,但實際情況真可以建立聚集索引,分析其原因是:如果未使用 unique 屬性建立聚集索引,資料庫引擎將向表自動新增乙個四位元組 uniqueifier 列。必要時,資料庫引擎 將向行自動新增乙個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,使用者不能檢視或訪問。

第三:是不是聚集索引就一定要比非聚集索引效能優呢?

如果想查詢學分在60-90之間的學生的學分以及姓名,在學分上建立聚集索引是否是最優的呢?

答:否。既然只輸出兩列,我們可以在學分以及學生姓名上建立聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所儲存的內容就是最終輸出的資料,這種索引在比以學分為聚集索引做查詢效能更好。

第四:在資料庫中通過什麼描述聚集索引與非聚集索引的?

索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的資料節點,而非聚集索引的葉節仍然是索引節點,但它有乙個指向最終資料的指標。

第五:在主鍵是建立聚集索引的表在資料插入上為什麼比主鍵上建立非聚集索引表速度要慢?

有了上面第四點的認識,我們分析這個問題就有把握了,在有主鍵的表中插入資料行,由於有主鍵唯一性的約束,所以需要保證插入的資料沒有重複。我們來比較下主鍵為聚集索引和非聚集索引的查詢情況:聚集索引由於索引葉節點就是資料頁,所以如果想檢查主鍵的唯一性,需要遍歷所有資料節點才行,但非聚集索引不同,由於非聚集索引上已經包含了主鍵值,所以查詢主鍵唯一性,只需要遍歷所有的索引頁就行,這比遍歷所有資料行減少了不少io消耗。這就是為什麼主鍵上建立非聚集索引比主鍵上建立聚集索引在插入資料時要快的真正原因。

好了,講這這些,不知道大家是否真的了解sql的聚焦索引,我也是資料庫新手(從使用時間上來講也不算新了,哈哈),不專業,有什麼不對的地方,希望大家批評指正,下篇我會分析一些資料庫訪問索引的情況,有圖的情況下,也許看的更加明白。

sql索引見解

索引分為聚集索引和非聚集索引,聚集索引為主鍵,沒主鍵則為非空列,沒非空列則資料庫自動生成隱藏列,且聚集索引由資料庫自己建立,程式設計師無法干涉。非聚集索引可以簡單理解為有序目錄,是一種以空間換取時間的方法。舉個例子,在乙個 user 表中,有乙個 id num 即身份號,此不為主鍵 id,那麼這些資...

SQL索引見解

其實對於非專業的資料庫操作人員來講,例如軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的dba團隊,他們會幫助你優化sql,開發人員即使不懂優化問題也不大,所以開發人員對這方面也...

SQL 索引 建立索引

create index 語句用於在表中建立索引。在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。您可以在表中建立索引,以便更加快速高效地查詢資料。使用者無法看到索引,它們只能被用來加速搜尋 查詢。注釋 更新乙個包含索引的表需要比更新乙個沒有索引的表更多的時間,這是由於索引本身也需要...