Mysql索引小記

理解索引前要先理解下面的概念
索引是什麼
索引是一個文件,一個表可以有多個索引文件,正常查找數據時查詢優化器判斷可以使用索引並且選擇索引後會優先讀取索引文件,根據索引找到對應數據或者數據ID後再做進一步篩選

索引方式
1:hash:無序索引,不能範圍查找,不能用於排序,使用比較少,缺點較多一般純內存引擎會用
2:B+樹:有序索引,非葉子節點不保存數據,只保存索引key,只有葉子節點保存數據,每次查找都要至葉子節點才能返回數據,一般4層深度可索引千萬級別數據(每個數據頁16k,行數據1kb,一個索引key16字節的情況,大多數情況使用這個)

下面主要討論B+樹索引類型

重點:B+樹索引是有序的(索引不就應該有序嗎,不然找個毛線,hash 是個例外)

索引分類

按整個索引文件分
1:聚集索引:葉子節點保存的是真實索引對應行的完整數據(一個表有且必須有一個 聚集索引,主鍵,或者第一個唯一索引或者系統默認生成一個rowid)

2:非聚集索引:葉子節點保存的是主鍵值;

按索引使用分
1:主鍵索引:唯一,值不能爲null,建立主鍵則自動生成主鍵索引,無需額外再建立

2:唯一索引:不能重複,值可以有一個爲null

3:全文索引:匹配長文字,性能不太好,一般用ES等搜索引擎代替mysql8.0 已經刪除

4:聯合索引:多個字段一起建立的索引,索引key按照所選字段從左至右拼接,使用注意最左匹配原則

幾個概念
1:回表:通過非聚集索引查找到數據後回到表的聚集索引查找原始數據

2:覆蓋索引:單個索引文件就能找到所有需要的字段信息,無需回表查詢原始數據(注意這裏是單個索引文件,簡單的說就是走一次索引就能完成查找的情況)

3:最左匹配原則:針對B+樹索引中的聯合索引,查找的多個字段必須匹配索引順序,索引字段可以不需要完全使用,但使用了的必須匹配順序;(hash索引的要百分百匹配)
eg:索引 a_b_c,則單字段a 可以用此索引,a and b 也是可用 a and b and c 也是可以;b and c, a and c ,a or b 是不可用的 (b and a 這種情況理論是不行的 但是sql有查詢優化器可能會將你的sql 改成 a and b 這樣就可以使用這個索引了)

4:索引失效:由於sql順序或者查找範圍 不滿足索引使用,導致全表掃碼的情況,主要有以下情況:
a:索引字段中使用函數,如count,sum 或者日期轉換等
b:聯合索引執行的sql字段順序不符合最左匹配原則
c:索引字段使用like %xxx 左邊通配的情況(xxx%,右邊通配可以用索引,誰叫排序是左邊開始排…)
d:連表字段類型不一致,一個int 一個 varchat;
e:使用 or 關聯 並且or 後面字段沒有索引

5:索引合併:一條sql 同時使用幾個索引文件的情況(mysql 5.0之後),sql 會根據多個個索引返回的數據進行交集 或者並集處理最後得出所要數據,是否使用得看查詢優化器計算,用 explain 查看sql type 顯示 index_merge,一般用or 且字段都有索引 是會使用索引合併的;

索引的缺點
a:索引需要佔用空間;
b:索引是需要維護的,新增,更新索引字段,刪除 數據等都要對索引進行維護,索引越多維護成本越大;
c:索引太多會影響查詢優化器的效率,甚至有可能選到效率更差的索引影響查詢速度;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章