簡單談一下Mysql索引
為什麼選擇B+樹
我們都知道雜湊索引,但是並沒有採用它,因為雜湊索引在儲存的時候是通過了hash值來進行儲存,hash值是無序的,不能進行範圍查詢。還有就是進行排序的話也不能使用雜湊索引。因為想UUID一樣是無序的東西。
平衡二叉樹
只能儲存兩個結點,資料量很大的情況下,樹的高度會非常的高,查詢資料時就會很慢。
另外當我們查詢id>的數時,首先要定位到5,然後迴旋查詢,效率很慢
B樹
樹的高度相對於二叉樹 高度降低,樹更加粗壯,查詢效率得到提升,但是對於id>5的問題,仍然需要先定位到5,然後進行迴旋查詢。
B+樹
葉子結點通過單項鍊表進行連線,用於解決迴旋查詢的問題。
非葉子結點只儲存key,葉子結點儲存了 key和value。
索引為什麼會失效
在聯合索引中有以下特點
1、a是有序的
2、當a固定時,b也是有序的
所以聯合索引就是先通過a欄位進行排序,然後再通過b欄位進行排序。
從而,在使用聯合索引時要注意最左匹配原則。
select * from table where a = '1' and b = '3'
這是使用到索引的
因為先對a進行排序,然後對b進行排序。
先查詢到a後b也就是有序的了,所以就用到了索引
select * from table where b > '3'
這沒有使用到索引
因為b只有在a固定的情況下才是有序的,這個把a幹掉了,b就是無序的,只能進行全表掃描
select * from table where a > '1' and b = '3' 這沒有使用到索引 查詢到a>1後,b是無序的,所以不能通過二分查詢查詢b的資料,只能進行全表掃描。 a = 1的話就可以
select * from table where a like '%1' and b = '3'
like 百分號放在左邊的話就用不到索引
字串排序是根據從前到後的字母順序進行排序的,這樣的話就不是有序的,就用不到索引
如何通過索引定位到一條資料
InnoDB與MyISAM的區別
MyISAM | InnoDB | |
---|---|---|
事物 | 不支援 | 支援 |
外來鍵 | 不支援 | 支援 |
索引 | 非聚集索引 支援FullText型別的全文索引 | 聚集索引 不支援FullText型別的全文索引,但是可以通過sphinx外掛進行實現,並且效果很好 |
鎖粒度 | 最小是表級鎖 | 最小支援行級鎖 |
硬碟儲存結構 | .frm儲存表的定義 .MYD儲存資料檔案 .MYI儲存索引檔案 | Frm儲存表的定義 Idb儲存資料和索引檔案,資料以主鍵進行聚簇儲存,真正的資料儲存在葉子結點中 |
聚簇索引和非聚簇索引
聚簇索引(InnoDB)
就是將資料與索引存放在一起,索引結構的葉子結點保留了行資料
表中的資料按照索引的順序來進行儲存,也就是索引項的順序與表中記錄的物理順序一致。
其他索引成為輔助索引,根據建立索引的欄位儲存相應的id值 如根據name建立索引,那麼久儲存name以及對應的id值。
聚簇索引預設是主鍵
如果沒有主鍵,就選擇一列唯一的非空列作為聚簇索引
如果沒有這樣的列,就會生成一個GEN_CLUST_INDEX的隱式聚簇索引
非聚簇索引(MyISAM)
資料與索引分開進行儲存
MyISAM都是先通過資料找地址,然後根據地址找資料。
通過輔助索引首先查詢到對應的id,然後再根據主索引通過id進行資料查詢。所以要經過兩次查詢,也就是所謂的回表。對於查詢頻率很高的資料欄位,建議進行覆蓋索引,如通過name查詢手機號以及地址這樣的請求頻率很高,我們可以建立一個 name phoneNum address 這樣的一個聯合索引,避免了回表。