欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談MySQL聚簇索引

 更新時間:2023年04月19日 11:47:06   作者:江南一點雨  
數(shù)據(jù)庫的索引從不同的角度可以劃分成不同的類型,聚簇索引便是其中一種。聚簇索引并不是一種單獨的索引類型,而是一種數(shù)據(jù)的存儲方式。本文詳細介紹了MySQL的聚簇索引,感興趣的同學可以參考閱讀

1. 什么是聚簇索引

數(shù)據(jù)庫的索引從不同的角度可以劃分成不同的類型,聚簇索引便是其中一種。

聚簇索引英文是 Clustered Index,有時候小伙伴們可能也會看到有人將之稱為聚集索引等,與之相對的是非聚簇索引或者二級索引。

聚簇索引并不是一種單獨的索引類型,而是一種數(shù)據(jù)的存儲方式。在 MySQL 的 InnoDB 存儲引擎中,所謂的聚簇索引實際上就是在同一個 B+Tree 中保存了索引和數(shù)據(jù)行:此時,數(shù)據(jù)放在葉子結(jié)點中,聚簇聚簇,意思就是說數(shù)據(jù)行和對應(yīng)的鍵值緊湊的存在一起。

假設(shè)我有如下數(shù)據(jù):

id(主鍵)usernameageaddressgender
1ab99深圳
2ac98廣州
3af88北京
4bc80上海
5bg85重慶
6bw95天津
7bw99海口
8cc92武漢
9ck90深圳
10cx93深圳

那么它的聚簇索引大概就是這個樣子:

那么大家可以看到,葉子上既有主鍵值(索引)又有數(shù)據(jù)行,節(jié)點上則只有主鍵值(索引)。

小伙伴們想想,MySQL 表中的數(shù)據(jù)在磁盤中只可能保存一份,不可能保存兩份,所以,在一個表中,聚簇索引只可能有一個,不可能有多個。

2. 聚簇索引和主鍵

有的小伙伴搞不清楚這兩者之間的關(guān)系,甚至將兩者劃等號,這是一個巨大的誤區(qū)。

在有的數(shù)據(jù)庫中,支持開發(fā)者自由的選擇使用哪一個索引作為聚簇索引,但是 MySQL 中是不支持這個特性的。

在 MySQL 中,如果表本身就有設(shè)置主鍵,那么主鍵就是聚簇索引;如果表本身沒有設(shè)置主鍵,則會選擇表中的一個唯一且非空的索引來作為聚簇索引;如果表中連唯一非空的索引都沒有,那么就會自動選擇表中的隱式主鍵來作為聚簇索引。關(guān)于 MySQL 中表的隱式主鍵,松哥會在將來的文章中和大家介紹。

不過一般來說,還是建議大家自己來為表設(shè)置主鍵,因為隱式主鍵是自增的,自增的都會存在一個問題:在自增值上會存在非常高的鎖競爭問題,主鍵的上界會稱為熱點數(shù)據(jù),因為所有的插入操作都要主鍵自增,又不能重復(fù),所以會發(fā)生鎖競爭進而導(dǎo)致性能降低。

根據(jù)上面的介紹,我們可以總結(jié)出 MySQL 中聚簇索引和主鍵索引的關(guān)系如下:

  • 聚簇索引不一定是主鍵索引。
  • 主鍵索引一定是聚簇索引。

3. 聚簇索引優(yōu)缺點

先來說優(yōu)點:

  • 相互關(guān)聯(lián)的數(shù)據(jù)我們可以將之保存在一起。例如有一個用戶訂單表,我們可以根據(jù) 用戶 ID + 訂單 ID 來聚集所有數(shù)據(jù),用戶 ID 可能會重復(fù),訂單 ID 則不會重復(fù),這樣我們就能夠?qū)⒁粋€用戶相關(guān)的訂單數(shù)據(jù)都保存在一起,如果需要查詢一個用戶的所有訂單,就會非??欤恍枰倭康拇疟P IO 就可以做到。
  • 不需要回表,因此數(shù)據(jù)訪問速度更快。在聚簇索引中,索引和數(shù)據(jù)都在同一棵 B+Tree 上,因此從聚簇索引中獲取到的數(shù)據(jù)比從非聚簇索引上獲取數(shù)據(jù)更快(非聚簇索引需要回表)。
  • 對于第一點的案例,如果我們想根據(jù)用戶 ID 查詢到這個用戶所有的訂單 ID,那么此時都不用去到葉子結(jié)點了,因為支節(jié)點上就有我們需要的數(shù)據(jù),所以直接利用覆蓋索引的特性,就可以讀取到需要的數(shù)據(jù)。

這些就是聚簇索引一些常見的優(yōu)點,我們在日常的表設(shè)計中,其實應(yīng)該充分利用好這些優(yōu)點。

再來看看缺點:

  • 小伙伴們發(fā)現(xiàn),前面我們說的聚簇索引的優(yōu)勢主要是聚簇索引減少了 IO 次數(shù),從而提高了數(shù)據(jù)庫的性能,但是有的 IO 密集型應(yīng)用,可能直接上一個足夠大的內(nèi)存,把數(shù)據(jù)都讀取到內(nèi)存中操作,此時聚簇索引就沒有啥優(yōu)勢了。
  • 隨機主鍵會導(dǎo)致頁分裂問題,主鍵順序插入的話,相對來說效率會高一些,因為在 B+Tree 中只需要不斷往后面追加即可;但是主鍵如果是非順序插入的話,效率就會低很多,因為可能會涉及到頁分裂問題。以上面那張圖為例,假設(shè)每個節(jié)點可以保存三條數(shù)據(jù),現(xiàn)在我們要插入一個主鍵是 4.5 的記錄,那么就需要把主鍵為 5 的值往后移動,進而導(dǎo)致主鍵為 8 的節(jié)點也要往后移動。頁分裂會導(dǎo)致數(shù)據(jù)插入效率降低并且占用更多的存儲空間。
  • 非聚簇索引(二級索引)查詢的時候需要回表。因為一個索引就是一棵索引樹,數(shù)據(jù)都在聚簇索引上,所以如果使用非聚簇索引進行搜索,非聚簇索引的葉子上存儲的是主鍵值,先找到主鍵值,然后拿著主鍵值再來聚簇索引上搜索,這樣一共就查詢了兩棵索引樹,這就是回表。

4. 最佳實踐

看了上面的介紹,相信小伙伴已經(jīng)了解了,在使用聚簇索引的時候,主鍵最好不要使用 UUID 這種隨機字符串,使用 UUID 隨機字符串至少存在兩方面的問題:

  • 插入效率低,因為插入可能會導(dǎo)致頁分裂,這個前面已經(jīng)說過了。
  • UUID 字符串所占用的存儲空間遠遠大于一個 bigint,如果使用 UUID 來做主鍵,意味著在二級索引中,一個葉子結(jié)點能夠存儲的主鍵值就非常有限,進而可能會導(dǎo)致樹增高,搜索時候 IO 次數(shù)增多,性能下降。

所以相對來說,主鍵自增會優(yōu)于 UUID。那么主鍵自增就是最完美的方案了嗎?很多小伙伴可能也聽說過一句話:沒有銀彈!所以,主鍵自增其實也有問題,具體什么問題,我們下便文章繼續(xù)。

到此這篇關(guān)于淺談MySQL聚簇索引的文章就介紹到這了,更多相關(guān)MySQL聚簇索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL空間數(shù)據(jù)存儲及函數(shù)

    MySQL空間數(shù)據(jù)存儲及函數(shù)

    這篇文章主要介紹的使MySQL空間數(shù)據(jù)存儲及函數(shù),MySQL提供了數(shù)據(jù)類型geometry用來存儲坐標信息,MySQL為空間數(shù)據(jù)存儲及處理提供了專用的類型geometry,下面就和小編一起學習下文吧
    2021-09-09
  • MySQL數(shù)據(jù)庫遠程連接很慢的解決方案

    MySQL數(shù)據(jù)庫遠程連接很慢的解決方案

    本文給大家分享的是MySQL數(shù)據(jù)庫遠程連接很慢的解決方法,簡單的說就是開啟skip-name-resolve,非常的簡單實用,有需要的小伙伴可以參考下
    2016-12-12
  • SQL字段拼接成新字段幾種常見的方法

    SQL字段拼接成新字段幾種常見的方法

    這篇文章主要給大家介紹了關(guān)于SQL字段拼接成新字段幾種常見的方法,如我們在選擇商品的時候不止需要知道商品的名字,還需要商品代碼型號等,這個時候需要把這些字段拼接為一個字段進行操作或者輸出,需要的朋友可以參考下
    2023-08-08
  • MySQL多版本并發(fā)控制MVCC底層原理解析

    MySQL多版本并發(fā)控制MVCC底層原理解析

    本文詳細講解了MySQL多版本并發(fā)控制MVCC底層原理,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • CentOS7 通過YUM安裝MySQL5.7的步驟詳解

    CentOS7 通過YUM安裝MySQL5.7的步驟詳解

    這篇文章主要介紹了CentOS7 通過YUM安裝MySQL5.7的步驟詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 詳解MySQL中的外鍵約束問題

    詳解MySQL中的外鍵約束問題

    這篇文章主要介紹了詳解MySQL中的外鍵約束問題,針對在MySQL中使用InnoDB表的情況,需要的朋友可以參考下
    2015-07-07
  • Mysql中強大的group?by語句解析

    Mysql中強大的group?by語句解析

    這篇文章主要介紹了Mysql中強大的group?by語句解析,GROUP?BY?語句根據(jù)一個或多個列對結(jié)果集進行分組。在分組的列上我們可以使用?COUNT,?SUM,?AVG,等函數(shù),需要的朋友可以參考下
    2023-07-07
  • Mysql數(shù)據(jù)庫之主從分離實例代碼

    Mysql數(shù)據(jù)庫之主從分離實例代碼

    本篇文章主要介紹了Mysql數(shù)據(jù)庫之主從分離實例代碼,MySQL數(shù)據(jù)庫設(shè)置讀寫分離,可以使對數(shù)據(jù)庫的寫操作和讀操作在不同服務(wù)器上執(zhí)行,提高并發(fā)量和相應(yīng)速度。
    2017-03-03
  • Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解

    Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解

    這篇文章主要介紹了Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解,本文圖文并茂給大家介紹的非常詳細,需要的朋友可以參考下
    2017-11-11
  • mysql動態(tài)游標學習(mysql存儲過程游標)

    mysql動態(tài)游標學習(mysql存儲過程游標)

    mysql動態(tài)游標示例,通過準備語句、視圖和靜態(tài)游標實現(xiàn),大家參考使用吧
    2013-12-12

最新評論