SQL中主鍵,聚集索引,非聚集索引的區別

2021-08-22 02:34:15 字數 944 閱讀 2873

主鍵:

主鍵是表中通常有唯一標誌著表中的每一行的值的一列或者多列,它的值用於唯一地標識表中的某一條記錄,用於強制表的實體完整性。主鍵用來乙個表引用來自其他表的特定記錄,主鍵是一種唯一關鍵字,表定義的一部分。可以理解為乙個記錄行的標識。我們通過這個標識,就能精確把這行記錄找出來,它在表中是唯一的

聚集索引:

前提是上面,如果我們定義了主鍵,那麼innodb會選擇主鍵作為聚集索引,如果沒有顯示定義的主鍵,那麼就會選擇不包含null值的唯一索引作為聚集索引,如果也沒有這樣的唯一索引列,那麼innodb就選著內建6位元組長的rowid作為隱含的聚集索引,這裡的rowid會隨著記錄的寫入而主鍵自增,但是它是不可引用和檢視的,是資料庫引擎內部的使用。

如果我們使用自增主鍵,那麼每次插入的新紀錄都在原先記錄的尾部按照順訊的新增到當前節點的索引後面,當一頁快寫滿的時候,就會開闢乙個新的頁。

資料記錄本身就存與主索引的葉子節點上,b+tree的樹。這就要求每乙個葉子節點內的各條資料記錄按主鍵順序存放,因此每當有有一條新的記錄插入的時候,mysql會根據其主鍵將其插入到合適的節點和位置上,如果頁面達到裝載因子(innodb預設為15/16),則開闢新的頁面(節點)

非聚集索引:

如果我們使用非聚集索引,例如我們平時所說的身份證號,學號等,因為每個人的身份證號,學號都不一樣,所以我們每次插入的值等同隨機插入,當插入乙個新的資料的時候,mysql不得不給資料找乙個合適的位置插入,並且可能會移動其他的資料記錄位置,甚至目標頁面可能已經被回寫到磁碟上而從快取中清掉了,此時又要從磁碟中讀回來,這就增加了很多的開銷,同時頻繁的移動資料,分頁操作造成資料的大量碎片。索引結構就不夠緊湊,後續可能不得不optimize table來重新構建表,進行優化。

總結:在效率方面最好使用聚集索引,並給表設定唯一主鍵。在資料索引的儲存有序的情況下,可以大大提高效率。在有序的情況下,通過索引查詢資料就無需遍歷索引記錄。就算在極端的情況下,資料查詢的效率是二分法查詢。將近是log(n)

聚集索引與非聚集索引 SQL

介紹 查詢資料表中的行的兩種方式,不管聚集索引,還是非聚集索引,都是用b 樹來實現的,關於b樹的介紹 clustered index 聚集索引 類似於使用字典的拼音索引來找字 表必須按順序排列,聚集索引的葉節點就是實際的資料頁,每一頁為乙個頁節點,訪問資料時表得保持順序故會減低速度,每個表只能有乙個...

聚集索引 非聚集索引

通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...

SQL聚集與非聚集索引

索引是在資料庫表或者檢視上建立的物件,目的是為了加快對錶或檢視的查詢的速度 按照儲存方式分為 聚集與非聚集索引 按照維護與管理索引角度分為 唯一索引 復合索引和系統自動建立的索引 索引的結構是由 根節點 非葉節點 非葉節點 葉節點 1 聚集索引 表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高...