SQL的索引問答

2021-06-28 14:15:34 字數 1402 閱讀 1424

說說sql聚集索引和非聚集索引的區別。

其中的兩個區別:

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

聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SQL 索引 建立索引

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

SQL優化(SQL 索引)

檢視表定義 show create table users 檢視表的索引 show index from users 你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫 包括left join中的臨時庫 的所有資訊時,資料庫會選擇最優方法 全表掃瞄!s表dept id na...

SQL中的索引

今天面試問到乙個東西 索引,我懵逼了,只知道這東西可以進行sql優化,但是根本不知道其中的原理。原文 實際上,索引可以理解成一種特殊的目錄。微軟的sql server提供了兩種索引 聚集索引 也可稱為聚類索引 簇集索引 和非聚集索引 當然也可以稱為非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集...