都是B+樹的數據結構
- 聚簇索引:將數據存儲和索引放在一起、並且是按照一定的順序組織的,找到索引也就找到了數據,數據的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那么對應的數據一定也是相鄰的存放在磁盤上的。
- 非聚簇索引:葉子節點不存儲數據,存儲的是數據行地址,也就是說根據索引查找到數據行的位置再去磁盤查找數據,這就有點類似一本書的目錄,比如要找到第三章第一節,那就現在目錄里面查找,找到對應的頁碼后再去對應的頁碼看文章。
優勢
1、查找通過聚簇索引可以直接獲取到數據,相比非聚簇索引需要第二次查詢(覆蓋索引除外)效率要高
2、聚簇索引對范圍查詢的效率很高,因為其數據是按照大小排列的
3、聚簇索引適合用在排序場合,非聚簇索引不適合。
劣勢
1、維護索引代價大,特別是插入新行或者主鍵被更新導致要分頁的時候。建議在大量插入新行后,選擇負載較低的時間段,通過OPTIMIZE TABLE優化表
2、表因為使用UUID作為主鍵,使數據存儲稀疏,這就會出現聚簇索引有可能會比全表掃面更慢,所以建議使用int的auto_increment作為主鍵。
3、如果主鍵比較大的話,那輔助索引將會變得更大,因為輔助索引的葉子節點存儲的是主鍵值,過長的主鍵值,會導致非葉子節點占用更多的物理空間
InnoDB中一定有主鍵,主鍵一定是聚簇索引,不手動設置,則會使用一個unique索引作為主鍵索引,沒有unique索引,則會使用數據庫內部的一個隱藏行id來當作主鍵索引。在聚簇索引之上創建的索引稱為輔助索引,輔助索引訪問數據總是需要二次查找,非聚簇索引都是輔助索引,像復合索引,前綴索引、唯一索引。輔助索引葉子節點存儲的不再是行的物理位置,而是主鍵值。
MyISM使用的是非聚簇索引,沒有聚簇索引。