mysql索引是幫助mysql高效獲取的排好序的數據結構
數據結構
二叉樹(左小右大)
缺點:如果是遞增或者遞減的數據,就會成一個鏈狀,失去了索引的功能
紅黑樹
二叉樹的升級版,如果是遞增或遞減的數據就會做一下優化
缺點:治標不治本,樹高還是很高 i/o 還是多
Hash表
在mysql中每一個索引都對應着hash表中的一個hash值,然后mysql就會把hash值和索引的內存地址存儲起來(k,v),每次用索引查詢的時候,mysql就會把索引通過hash運算,然后得到hash值, 然后就能高效的查到索引的地址(缺點:1.哈希沖突,2.這種結構不適用范圍性查找,所以用的不多 只有數據量特別大,而且基本不會用范圍性查詢)mysql索引支持這種數據結構,只是用的不多
B-Tree
增加了橫向寬度,索引和data是在一塊的所以存索引存的少(相對應B+Tree)
B+Tree *
現在mysql索引99%都是用的這種索引 優點 :加大了橫向寬度(一個節點大小是16KB,也是左小右大於等於,一個節點對應着一個分支,只有在葉子節點上才存數據地址(MyISAM)(InnoDB存的是主鍵)。非葉子節點存儲的都是冗余的節點。)所以即便是上千萬的數據,縱向(樹的高度)也不會超過4。所以大大的提高了查找效率。目前mysql索引大多數都是用的這種
MyISAM
非聚集索引:索引和數據是分開的 索引的data部分只是索引的地址值(輕量)
InnoDB(支持事務)
2.聚集索引:就是索引的data數據部分是表的全部信息(索引和數據在一塊),這樣就不用在進行 i/o操作了(重量)
3.InnoDB表必須有主鍵,如果你不加,他會先找一列合適的作為主鍵,如果找不到,就會自己建一列主鍵。因為B+Tree是需要索引來維護的。
整形主鍵比其他的主鍵(eg:UUID)比較起來會更快(因為用索引查找的時候,會比大小),自增是為了在葉子節點上好存儲(拆中間的肯定比在末尾加慢了)
InnoDB和MYISAM類型表物理磁盤存儲的區別