記錄那些坑
本文會持續更新,陸續更新有關mysql技術內幕、實戰優化、面試技巧。
文章目錄
- 前言
- 索引
- BTree之聚集索引
- BTree之輔助索引
- BTree之聯合索引
- BTree之覆蓋索引
- 使用到的工具
- 1、py_innodb_page_info工具
- 2、hexdump工具
- 總結
前言
重中之重的MySql數據庫
mysql數據庫不僅在工作中經常使用,面試中也是必問的內容。本文主要內容參考“mysql技術內幕”一書。
提示:以下是本篇文章正文內容,下面案例可供參考
索引
數據庫要想查的快,索引得利用好。
數據庫要想入的快,索引太多可不好。
mysql中索引類型有:BTree,Full Text,Hash,RTree。
BTree之聚集索引
聚集索引:ID索引
ID索引使用BTree結構,每個表僅且只有一個!!!,(即使沒有創建主鍵,mysql會默認創建一個隱藏列作為ID索引)
BTree高度:
BTree中節點存儲鍵值和地址指針,葉子結點存儲鍵值、指針、數據。
物理上不一定是順序的,邏輯上是順序的(通過指針鏈接)。
BTree之輔助索引
輔助索引就是主鍵以外的 單個字段的BTree索引類型的了。
輔助索引 葉子結點書簽:聚集索引鍵。
當通過輔助索引來尋找數據時,InnoDB存儲引擎會遍歷輔助索引并通過葉級別的指針獲得指向主鍵索引的主鍵,然后再通過主鍵索引來找到一個完整的行記錄。
BTree之聯合索引
將多個字段聯合一起做索引,索引結構如下:
根據圖示需要清楚,鍵值是個多元組,多元組中是按照字段的順序進行排列的。所以,在進行查詢時,如果沒有按照自從向右的字段查詢,就會打破聯合索引,使之失效!!!
注意:如果創建聯合索引(a,b,c);如果查詢a和b order by c ,就可以使用到聯合索引; 如果查詢a 直接order by c,就不會使用到索引,因為(a,c)并沒有排序
BTree之覆蓋索引
覆蓋索引常見的場景為:直接使用索引查詢出索引鍵值、主鍵的內容,根據索引的字段進行范圍或非范圍的統計。
判斷是否為覆蓋索引,使用explain,查看Extra字段,如果為Using index,就表示走了。
案例:(t表,a為主鍵,c為輔助索引,cd為聯合索引,b無索引)
- explain SELECT a from t where c = 1 ; 為覆蓋索引
- explain SELECT count(*) from t ; 為覆蓋索引
- explain SELECT count(b) from t ; 全表掃描
- explain SELECT count(b) from t where c >10 ; 非覆蓋索引,先走c的輔助索引然后走主鍵索引。
- explain SELECT count(*) from t where d > 0 and d<10 ; 為覆蓋索引
使用到的工具
1、py_innodb_page_info工具
首先 git 下載 https://gitee.com/andy_yyf/py_innodb_page_info
clone到合適位置。
本地需要有python2 (一般服務器自帶)
執行命令:python py_innodb_page_info.py /{對應的path}/t.ibd -v
2、hexdump工具
在Windows操作系統下,可以選擇通過程序UltraEdit打開該二進制文件。在Linux環境下,使用命令hexdump-C-v mytest.ibd>mytest.txt。這里將結果重定向到了文件mytest.txt,打開mytest.txt文件,找到如下內容:xxxx
總結
提示:
本文僅僅簡單說明了有關mysql相關內容,如深入理解可讀相關層面的書籍。