標籤:物理地址 沒有 資料 根據 索引值 問題 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叢集索引和非叢集索引