1. 程式人生 > >說說MySQL索引MyISAM和InnoDB的區別

說說MySQL索引MyISAM和InnoDB的區別

如題,廢話不多說,
首先兩者都是使用B+樹作為底層的資料結構的。
下圖是MyISAM索引的原理圖(圖是網上找的。。。):
這裡寫圖片描述
這個圖就很明顯了:
1,葉節點的data域存放的是資料記錄的地址。MyISAM的索引與行記錄是分開儲存的,叫做非聚集索引(UnClustered Index)。col1,col2,col3資料是獨立額外儲存的。索引是單獨的,我的理解就是一本書的目錄和裡面的內容是獨立的,葉子節點只有一個頁碼。
2,上面沒有的鍵值對應著col1裡面的值,這是以col1作為主鍵的結果,同樣你也可以把col2設為主鍵,那結構圖如下:
這裡寫圖片描述

MyISAM的索引方式也叫做“非聚集”的,之所以這麼稱呼是為了與InnoDB的聚集索引區分。

InnoDB索引實現

雖然InnoDB也使用B+Tree作為索引結構,但具體實現方式卻與MyISAM截然不同。
這裡寫圖片描述

首先:可以看到葉節點包含了完整的資料記錄。這種索引叫做聚集索引。InnoDB的資料檔案本身就是索引檔案!!!從上文知道,MyISAM索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的地址。而在InnoDB中,表資料檔案本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域儲存了完整的資料記錄。這個索引的key是表的主鍵,因此InnoDB表資料檔案本身就是主鍵索引。

這裡InnoDB必須要有主鍵,因為資料檔案要根據主鍵才能組合成一個索引結構,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含欄位作為主鍵,這個欄位長度為6個位元組,型別為長整形。

下面再說說不同索引在這兩種引擎中的差別.
主要的索引如下:
普通索引:最基本的索引,沒有任何限制
唯一索引:與”普通索引”類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
全文索引:僅可用於 MyISAM 表,針對較大的資料,生成全文索引很耗時好空間。
組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左字首“原則。

這裡主要是普通索引和主鍵索引的區別;

MyISAM
-主鍵索引/非主鍵索引
葉子節點上均帶有行號,通過行號進行索引(行號即資料的地址指標)
主鍵索引與普通索引無太大區別。

InnoDB
-主鍵索引(聚簇索引) 葉子節點上帶有資料
-非主鍵索引(第二索引) 葉子節點上帶有主鍵的key(既不是資料也不是地址!)
InnoDB的聚集索引儲存資料行本身,普通索引儲存主鍵

因而對於InnoDB表,可以看到:

(1)不建議使用過長 的欄位作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大;

(2)建議使用趨勢遞增的key做主鍵,由於資料行與索引一體,這樣不至於插入記錄時,有大量索引分裂,行記錄移動。非單調的主鍵會造成在插入新記錄時資料檔案為了維持B+Tree的特性而頻繁的分裂調整樹結構,從而影響效能;