MySQL 聚簇索引 二級索引 輔助索引(上兩期中獎名單)

閱讀文本大概需要3分鐘。

       MySQL中每個表都有一個聚簇索引( clustered index ),除此之外的表上的每個非聚簇索引都是二級索引,又叫輔助索引( secondary indexes )。以InnoDB來說,每個InnoDB表具有一個特殊的索引稱爲聚集索引。如果表上定義有主鍵,那麼該主鍵索引是聚集索引。如果表中沒有定義主鍵,那麼MySQL取第一個唯一索引( unique )而且只含非空列( NOT NULL )作爲主鍵,InnoDB使用它作爲聚集索引。如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個字節,而且是隱藏的,使其作爲聚簇索引。

0x01:聚簇索引,說起索引,不能不說B+樹

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

      MySQL官方索引的定義:索引( Index )是幫助MySQL高效獲取數據的數據結構。提取句子主幹,就可以得到索引的本質;索引是數據結構。

      數據庫查詢是數據庫的最主要功能之一。誰都希望查詢數據的速度能儘可能的快,因此數據庫系統的設計者會從查詢算法的角度進行優化。最基本的查詢算法當然是順序查找( linear search ),這種複雜度爲O(n)的算法在數據量很大時顯然是糟糕的,好在計算機科學的發展提供了很多更優秀的查找算法,例如二分查找(binary search)二叉樹查找(binary tree search)等。如果稍微分析一下會發現,每種查找算法都只能應用於特定的數據結構之上,例如二分查找要求被檢索數據有序,而二叉樹查找只能應用於二叉查找樹上,但是數據本身的組織結構不可能完全滿足各種數據結構(例如,理論上不可能同時將兩列都按順序進行組織),所以在數據之外,數據庫系統還維護着滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找算法。這種數據結構,就是索引。

     聚簇索引並不是一種單獨的索引類型,而是一種數據存儲方式。具體的細節依賴於其實現方式,但InnoDB的聚簇索引實際上在同一個結構中保存了B-Tree索引和數據行。

      當表有聚簇索引時,他的數據行實際上存放在索引的葉子頁(leaf page)中。術語 “聚簇”表示數據行和相鄰的鍵值緊湊地存儲在一起(這並非總成立)。因爲無法同時把數據行存放在兩個不同的地方,索引一個表只能有一個聚簇索引。

圖來源:https://blog.csdn.net/onupway/article/details/88805368

0x02:聚族索引的優點

  • 可以把相關數據保存在一起。例如實現電子郵件時,可以根據用戶ID來聚集數據,這樣只需要從磁盤讀取少數的數據頁就能獲取某個用戶的全部郵件。如果沒有使用聚族索引,則每封郵件都可能導致一次磁盤I/O;

  • 數據訪問更快。聚族索引將索引和數據保存在同一個B-Tree中,因此從聚族索引中獲取數據通常比在非聚族索引中查找更快。

  • 使用覆蓋索引掃描的查詢可以直接使用節點中的主鍵值。

0x03:聚族索引的缺點

  • 聚簇數據最大限度的提高了I/O密集型應用的性能,但如果數據全部都放在內存中,則訪問的順序就沒有那麼重要了,聚簇索引也就沒有那麼優勢了;

  • 插入速度嚴重依賴於插入順序。按照主鍵的順序插入是加載數據到InnoDB表中速度最快的方式。但如果不是按照主鍵順序加載數據,那麼在加載完成後最好使用OPTIMIZE TABLE命令重新組織一下表。

  • 更新聚簇索引列的代價很高,因爲會強制InnoDB將每個被更新的行移動到新的位置。

  • 基於聚簇索引的表在插入新行,或者主鍵被更新導致需要移動行的時候,可能面臨“頁分裂”的問題。當行的主鍵值要求必須將這一行插入到某個已滿的頁中時,存儲引擎會將該頁分裂成兩個頁面來容納該行,這就是一次分裂操作。頁分裂會導致表佔用更多的磁盤空間。

  • 聚簇索引可能導致全表掃描變慢,尤其是行比較稀疏,或者由於頁分裂導致數據存儲不連續的時候。

  • 二級索引(非聚簇索引)可能比想象的要更大,因爲在二級索引的葉子節點包含了引用行的主鍵列。

  • 二級索引訪問需要兩次索引查找,而不是一次。

有關二級索引需要兩次索引查找的問題?

    答案在於二級索引中保存的“行指針”的實質。要記住,二級索引葉子節點保存的不是指向行的物理位置的指針,而是行的主鍵值。這意味着通過二級索引查找行,存儲引擎需要找到二級索引的葉子節點獲得對應的主鍵值,然後根據這個值去聚簇索引中查找到對應的行。這裏做了重複的工作:兩次B-Tree查找而不是一次。對於InnoDB,自適應哈希索引能夠減少這樣的重複工作。

中獎名單如下:Vancurphon與vil

參考:https://www.cnblogs.com/starhu/p/6406495.html

往期精彩

01 漫談發版哪些事,好課程推薦

02 Linux的常用最危險的命令

03 精講Spring Boot—入門+進階+實例

04 優秀的Java程序員必須瞭解的GC哪些

05 互聯網支付系統整體架構詳解

關注我

每天進步一點點

喜歡!在看☟

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章