1. 程式人生 > 其它 >簡單談一下Mysql索引

簡單談一下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 這樣的一個聯合索引,避免了回表。


Light up the dark.❤️