MySQL叢集索引和非叢集索引

來源:互聯網
上載者:User

標籤:物理地址   沒有   資料   根據   索引值   問題   class   show   engine   

索引分為叢集索引和非叢集索引,mysql中不同的儲存引擎對索引的底層實現可能會不同,這裡只關注mysql的預設儲存引擎InnoDB。
利用下面的命令可以查看預設的儲存引擎

show variables like ‘%storage_engine%‘;
叢集索引:

索引中索引值的邏輯順序決定了表中相應行的物理順序(索引中的資料物理存放地址和索引的順序是一致的),可以這麼理解:只要是索引是連續的,那麼資料在儲存介質上的儲存位置也是連續的。
比方說:想要到字典上尋找一個字,我們可以根據字典前面的拼音找到該字,注意拼音的排列時有順序的。

打個比方:當我們想要找“啊”這個字,然後又想找“不”這個字,根據拼音來看“b”一定在”a“的後面。

叢集索引就像我們根據拼音的順序查字典一樣,可以大大的提高效率。在經常搜尋一定範圍的值時,通過索引找到第一條資料,根據物理地址連續儲存的特點,然後檢索相鄰的資料,直到到達條件截至項。

非叢集索引

索引的邏輯順序與磁碟上的實體儲存體順序不同。非叢集索引的索引值在邏輯上也是連續的,但是表中的資料在儲存介質上的物理順序是不一致的,即記錄的邏輯順序和實際儲存的物理順序沒有任何聯絡。索引的記錄節點有一個資料指標指向真正的資料存放區位置。

非叢集索引就像根據偏旁部首查字典一樣,字典前面的目錄在邏輯上也是連續的,但是查兩個偏旁在目錄上挨著的字時,字典中的字卻很不可能是挨著的。

下面是MySQL文檔中關於索引的說明:文檔說明

每個InnoDB表有一個特殊的指數稱為叢集索引所在的行的資料存放區。通常,叢集索引是主鍵的同義字。從查詢,插入效能最好,和其他的資料庫操作,必須瞭解InnoDB使用叢集索引來最佳化每個表最常見的查詢和DML操作。
當你定義你的表的主鍵,InnoDB使用它作為叢集索引。為您建立的每個表定義一個主鍵。如果沒有邏輯唯一的和非空的列或列集,添加一個新的自動增量列,它的值自動填滿。
如果你不確定你的表的主鍵、唯一索引,MySQL定位第一所有鍵列不為空白,InnoDB使用它作為叢集索引。
如果表沒有主鍵或唯一索引InnoDB內部適用,產生一個隱藏的叢集索引為合成列包含行ID值gen_clust_index。行的ID,InnoDB分配在這樣一個表中的行排序。行ID是一個6位元組欄位的單調增加,在插入新行。因此,行id命令的行在物理上是插入順序。

總結如下:

  • 如果一個主鍵被定義了,那麼這個主鍵就是作為叢集索引
  • 如果沒有主鍵被定義,那麼該表的第一個唯一非空索引被作為叢集索引
  • 如果沒有主鍵也沒有合適的唯一索引,那麼innodb內部會產生一個隱藏的主鍵作為叢集索引,這個隱藏的主鍵是一個6個位元組的列,改列的值會隨著資料的插入自增。

InnoDB引擎會為每張表都加一個叢集索引,而叢集索引指向的的資料又是以物理磁碟順序來儲存的,自增的主鍵會把資料自動向後插入,避免了插入過程中的叢集索引排序問題。如果對叢集索引進行排序,這會帶來磁碟IO效能損耗是非常大的。

MySQL叢集索引和非叢集索引

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.