問題
?我們知道在 MySQL 中創(chuàng)建一張表時(shí),一些統(tǒng)計(jì)表會(huì)發(fā)生變化,比如:mysql/innodb_index_stats,會(huì)多出幾行對(duì)新表的描述。
那么會(huì)變更幾張表?這些統(tǒng)計(jì)表是如何變化的?
實(shí)驗(yàn)
本期我們用 MySQL 提供的 DBUG 工具來研究 MySQL 的 SQL 處理流程。
起手先造個(gè)實(shí)例

這里得稍微改一下實(shí)例的啟動(dòng)文件 start,將 CUSTOM_MYSQLD 改為 mysqld-debug:

重啟一下實(shí)例,加上 debug 參數(shù):

我們來做一兩個(gè)實(shí)驗(yàn),說明 DBUG 包的作用:先設(shè)置一個(gè)簡(jiǎn)單的調(diào)試規(guī)則,我們?cè)O(shè)置了兩個(gè)調(diào)試選項(xiàng):
- d:開啟各個(gè)調(diào)試點(diǎn)的輸出
- O,/tmp/mysqld.trace:將調(diào)試結(jié)果輸出到指定文件

然后我們創(chuàng)建了一張表,來看一下調(diào)試的輸出結(jié)果:

可以看到 create table 的過程中,MySQL 的一些細(xì)節(jié)操作,比如分配內(nèi)存 alloc_root 等
這樣看還不夠直觀,我們?cè)黾右恍┬畔ⅲ?/p>
來看看效果:

可以看到輸出變成了調(diào)用樹的形式,現(xiàn)在就可以分辨出 alloc_root 分配的內(nèi)存,是為了解析 SQL 時(shí)用的(mysql_parse)
我們?cè)僭黾右恍┯杏玫男畔ⅲ?/p>
可以看到結(jié)果中增加了文件名和行號(hào):

現(xiàn)在我們可以在輸出中找一下統(tǒng)計(jì)表相關(guān)的信息:

可以看到 MySQL 在這里非常機(jī)智,直接執(zhí)行了一個(gè)內(nèi)置的存儲(chǔ)過程來更新統(tǒng)計(jì)表。
沿著 que_eval_sql,可以找到其他類似的統(tǒng)計(jì)表,比如下面這些:


本次實(shí)驗(yàn)中,我們借助了 MySQL 的 DBUG 包,來讓 MySQL 將處理過程暴露出來。MySQL 中類似的技術(shù)還有不少,比如 performance_schema,OPTIMIZER_TRACE 等等。
這些技術(shù)將 MySQL 的不同方向的信息暴露出來,方便大家理解其中機(jī)制。