MySQL彙集索引和非彙集索引

索引分爲彙集索引和非彙集索引,mysql中不一樣的存儲引擎對索引的底層實現可能會不一樣,這裏只關注mysql的默認存儲引擎InnoDB。
利用下面的命令能夠查看默認的存儲引擎html

show variables like '%storage_engine%';

彙集索引:

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

打個比方:當咱們想要找「啊」這個字,而後又想找「不」這個字,根據拼音來看「b」必定在」a「的後面。sql

彙集索引就像咱們根據拼音的順序查字典同樣,能夠大大的提升效率。在常常搜索必定範圍的值時,經過索引找到第一條數據,根據物理地址連續存儲的特色,而後檢索相鄰的數據,直到到達條件截至項。數據庫

非彙集索引

索引的邏輯順序與磁盤上的物理存儲順序不一樣。非彙集索引的鍵值在邏輯上也是連續的,可是表中的數據在存儲介質上的物理順序是不一致的,即記錄的邏輯順序和實際存儲的物理順序沒有任何聯繫。索引的記錄節點有一個數據指針指向真正的數據存儲位置。性能

非彙集索引就像根據偏旁部首查字典同樣,字典前面的目錄在邏輯上也是連續的,可是查兩個偏旁在目錄上挨着的字時,字典中的字卻很不多是挨着的。優化


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

每一個InnoDB表有一個特殊的指數稱爲彙集索引所在的行的數據存儲。一般,彙集索引是主鍵的同義詞。從查詢,插入性能最好,和其餘的數據庫操做,必須瞭解InnoDB使用匯集索引來優化每一個表最多見的查詢和DML操做。
當你定義你的表的主鍵,InnoDB使用它做爲彙集索引。爲您建立的每一個表定義一個主鍵。若是沒有邏輯惟一的和非空的列或列集,添加一個新的自動增量列,它的值自動填充。
若是你不肯定你的表的主鍵、惟一索引,MySQL定位第一全部鍵列不爲空,InnoDB使用它做爲彙集索引。
若是表沒有主鍵或惟一索引InnoDB內部適用,生成一個隱藏的彙集索引爲合成列包含行ID值gen_clust_index。行的ID,InnoDB分配在這樣一個表中的行排序。行ID是一個6字節字段的單調增長,在插入新行。所以,行id命令的行在物理上是插入順序。code

總結以下:htm

  • 若是一個主鍵被定義了,那麼這個主鍵就是做爲彙集索引
  • 若是沒有主鍵被定義,那麼該表的第一個惟一非空索引被做爲彙集索引
  • 若是沒有主鍵也沒有合適的惟一索引,那麼innodb內部會生成一個隱藏的主鍵做爲彙集索引,這個隱藏的主鍵是一個6個字節的列,改列的值會隨着數據的插入自增。

InnoDB引擎會爲每張表都加一個彙集索引,而彙集索引指向的的數據又是以物理磁盤順序來存儲的,自增的主鍵會把數據自動向後插入,避免了插入過程當中的彙集索引排序問題。若是對彙集索引進行排序,這會帶來磁盤IO性能損耗是很是大的。排序

相關文章
相關標籤/搜索