MySQL索引

前言

 前面咱們提到MySQL的加鎖,鎖是做用於索引的。那麼本篇文章說下索引。性能

聚簇索引(Clustered Indexes)

InnoDB存儲引擎的數據組織方式,是聚簇索引表:完整的記錄,存儲在主鍵索引中,經過主鍵索引,就能夠獲取記錄全部的列.設計

每一個InnoDB的表有一個特殊的索引稱之爲聚簇索引,每行的數據就是存儲在聚簇索引中.一般,聚簇索引和主鍵同義.排序

當你在你的表上面定義一個主鍵時,InnoDB將其做爲聚簇索引.建議爲你的表都建立一個主鍵.若是沒有惟一而且非空的一列或者多列(用來作你的主鍵),那麼能夠建立一個自動填充的自增列(好比ID)索引

若是你的表沒有定義主鍵,MySQL會將第一個全部列都非空的UNIQUE索引做爲聚簇索引.innodb

若是你的表不存在這樣的UNIQUE索引(見上),InnoDB內部會自動隱式生成一個包含行ID的列並在其上面創建聚簇索引.這一列按行ID排序.行ID是一個6-byte的嚴格單調自增的字段.所以,按照行在物理上是按照插入順序排序的.搜索

總額來講聚簇索引是由一個或多個列組成,用於惟一性標識數據表中的某一條記錄。一個表能夠沒有主鍵,但最多隻能有一個主鍵,而且主鍵值不能包含NULL。時間戳

在MySQL中,InnoDB引擎的數據表的主鍵設計咱們一般遵循幾個原則:數據

  1. 採用一個沒有業務用途的自增屬性列做爲主鍵;
  2. 主鍵字段值老是不更新,只有新增或者刪除兩種操做;
  3. 不選擇會動態更新的類型,好比當前時間戳等。

之因此這麼作的幾點優點:查詢

  1. 新增數據時,因爲主鍵值是順序增加的,innodb page發生分裂的機率下降了;
  2. 業務數據有變動時,不修改主鍵值,物理存儲位置發生變化的機率下降了,innodb page中產生碎片的機率也下降了。

聚簇全部是如何加速查詢的呢?db

經過聚簇全部訪問一行很是快,這是由於在聚簇索引上搜索會直接定位到包含你須要的行的數據所在的頁上(page).

二級索引(Secondary Indexes)

除了聚簇索引其餘索引都是二級索引.其能夠劃分爲:惟一索引、非惟一索引。

惟一索引其實應該叫作惟一性約束,它的做用是避免一列或多列值存在重複,是一種約束性索引。

在InnoDB中每一個二級索引記錄都包含了這一行的主鍵列和當前這個二級索引包含的列.

InnoDB使用二級索引中包含的主鍵取索引這一行對應的聚簇索引,進而找到這一行完整的數據.

注意:若是主鍵很長,則二級索引會佔有更多的空間,所以建議使用短的列作主鍵.

從查詢性能上來講,在MyISAM表中主鍵索引和不容許有NULL的惟一索引的查詢性能是至關的,在InnoDB表經過惟一索引查詢則須要多一次從二級索引到主鍵索引的轉換過程。InnoDB表基於普通索引的查找代價更高,由於每次檢索到結果後,還須要至少再多檢索一次才能確認是否還有更多符合條件的結果,主鍵索引和惟一索引就不須要這麼作了。

相關文章
相關標籤/搜索