問題
?我們知道在 MySQL 中創建一張表時,一些統計表會發生變化,比如:mysql/innodb_index_stats,會多出幾行對新表的描述。
那么會變更幾張表?這些統計表是如何變化的?
實驗
本期我們用 MySQL 提供的 DBUG 工具來研究 MySQL 的 SQL 處理流程。
起手先造個實例
這里得稍微改一下實例的啟動文件 start,將 CUSTOM_MYSQLD 改為 mysqld-debug:
重啟一下實例,加上 debug 參數:
我們來做一兩個實驗,說明 DBUG 包的作用:先設置一個簡單的調試規則,我們設置了兩個調試選項:
- d:開啟各個調試點的輸出
- O,/tmp/mysqld.trace:將調試結果輸出到指定文件
然后我們創建了一張表,來看一下調試的輸出結果:
可以看到 create table 的過程中,MySQL 的一些細節操作,比如分配內存 alloc_root 等
這樣看還不夠直觀,我們增加一些信息:
來看看效果:
可以看到輸出變成了調用樹的形式,現在就可以分辨出 alloc_root 分配的內存,是為了解析 SQL 時用的(mysql_parse)
我們再增加一些有用的信息:
可以看到結果中增加了文件名和行號:
現在我們可以在輸出中找一下統計表相關的信息:
可以看到 MySQL 在這里非常機智,直接執行了一個內置的存儲過程來更新統計表。
沿著 que_eval_sql,可以找到其他類似的統計表,比如下面這些:
本次實驗中,我們借助了 MySQL 的 DBUG 包,來讓 MySQL 將處理過程暴露出來。MySQL 中類似的技術還有不少,比如 performance_schema,OPTIMIZER_TRACE 等等。
這些技術將 MySQL 的不同方向的信息暴露出來,方便大家理解其中機制。