mysql索引之聚集索引

2021-07-02 03:52:36 字數 1302 閱讀 1945

聚集索引不是一種單獨的索引型別,而是一種儲存資料方式。其具體細節依賴於實現方式,但是innodb的聚集索引實際上在同樣的結構中儲存了b-tree索引和資料行。

當表有聚集索引的時候,它的資料行實際儲存在索引的葉子頁中。術語「聚集」指實際的資料行和相關的鍵值都儲存在一起。每個表只能有乙個聚集索引,因為不能一次把行儲存在兩個地方。(但是,覆蓋索引可以模擬多個聚集索引)

當前,soliddb和innodb是唯一支援聚集索引的儲存引擎。innodb按照主鍵進行聚集,如果沒有定義主鍵,innodb會試著使用唯一的非空索引來代替。如果沒有這種索引,innodb就會定義隱藏的主鍵然後在上面進行聚集。

聚集主鍵有助於效能,但是它也能導致嚴重的效能問題。

優點:

1.可以把相關資料儲存在一起。

2.資料訪問快。聚集索引把索引和資料都儲存到同一棵b-tree中,因此從聚集索引中取得資料通常在非聚集索引進行查詢要快。

3.使用覆蓋索引的查詢可以使用包含在葉子節點中的主鍵值

如果表和查詢可以使用它們,這些優點能極大地提高效能。

缺點:

1.聚集能最大限度地提公升i/o密集負載的效能。如果資料能裝入記憶體,那麼其順序也就無怕謂了,這樣聚集就沒什麼用處。

2.插入速度嚴重依賴於插入順序。按照主鍵的順序插入行是把資料裝入innodb表最快的方法。如果沒有按照主鍵順序插入資料,那麼在插入之後最好使用optimize table重新組織一下表。

3.更新聚集索引列是昂貴的,因為它強制innodb把每個更新的遷移到新的位置。

3.建立在聚集索引上的表在插入新行,或者在行的主鍵被更新,該行必須被移動的時候會進行分頁。分布發生在行的鍵值要求行必須被放到乙個已經放滿了資料的頁的時候,此時儲存引擎必須分頁才能容納該行。分頁會導致表占用更多的磁碟空間

4.聚集表可能會比全表掃瞄慢,尤其在表儲存得比較稀疏或因為分頁而沒有順序儲存的時候。

5.第二(非聚集)索引可能會比預想的大,因為它們的葉子節點包含了被引用行的主鍵列。

6.第二索引訪問需要兩次索引查詢,而不是一次(葉子節點不會儲存引用的行的物理位置,而是保持了行的主鍵值)

這意味著為了從第二索引查詢行,儲存引擎首先要找到葉子,然後使用儲存在那裡的主鍵值找到主鍵。最終找到行。這需要兩次動作,兩次b-tree導航(在innodb中,自適應雜湊索引能減少這種損失)

如果正在使用innodb並且不需要任何特定的聚集,就可以定義乙個**鍵。它是一種主鍵,但是值和應用程式無關。最簡單的方法是使用auto_increment列。這會是順序插入的並且能提高使用主鍵聯接的效能,減少分頁和碎片產生。

**

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...

MySQL 聚集索引 非聚集索引簡述

mysql索引中可以分為聚集索引與非聚集索引兩類,在網路上也見過聚簇的說法,這裡先簡單介紹兩種索引的含義與適用場景。懶得畫圖,全是字。索引的鍵值邏輯順序決定了表資料行的物理儲存順序,也就是在資料庫上連線的記錄在磁碟上的物理儲存位址也是相鄰的,注意這一點特性,我們可以分析出它的適用情況。由於聚集索引規...

MySQL聚集索引和非聚集索引

mysql的innodb儲存引擎的索引分為聚集索引和非聚集索引兩大類,理解聚集索引和非聚集索引可通過對比漢語字典的索引。漢語字典提供了兩類檢索漢字的方式,第一類是拼音檢索 前提是知道該漢字讀音 比如拼音為cheng的漢字排在拼音chang的漢字後面,根據拼音找到對應漢字的頁碼 因為按拼音排序,二分查...