這個專欄的內(nèi)容是我工作以來看過講MySQL最深入而且最細致的,作者丁奇是前阿里資深技術(shù)專家,和褚霸(霸爺)一起研究數(shù)據(jù)庫7年之久,我覺得很有必要把這個專欄重新讀一下并做好筆記,以求共勉。
特別注意由于丁奇在數(shù)據(jù)庫領(lǐng)域比較資深崔列,所以很多知識他可能認為你至少應(yīng)該是了解的,如果完全不了解某個知識點旺遮,建議先去網(wǎng)上找找資料赵讯,對知識點有個大致的輪廓。
專欄地址:
https://time.geekbang.org/column/intro/139
首先是MySQL的基本架構(gòu)示意圖:
存儲引擎層:
現(xiàn)在最常用的存儲引擎是 InnoDB耿眉,它從 MySQL 5.5.5 版本開始成為了默認存儲引擎边翼。
連接器:
mysql -h$ip -P$port -u$user -p
連接器判斷用戶名和密碼,強烈建議密碼不要直接加載-p后面鸣剪,不安全伪朽。連接器在連接建立之后授予用戶權(quán)限梗摇,就算用戶修改了權(quán)限,本次連接中也不會生效饲漾。
客戶端如果太長時間沒動靜鞍盗,連接器就會自動將它斷開津肛。這個時間是由參數(shù) wait_timeout 控制的嫉戚,默認值是 8 小時棒呛。
長期使用長連接可能會導(dǎo)致連接對象內(nèi)存暴漲(因為內(nèi)存釋放是在連接斷開之后),如果你用的是 MySQL 5.7 或更新版本饺鹃,可以在每次執(zhí)行一個比較大的操作后莫秆,通過執(zhí)行mysql_reset_connection 來重新初始化連接資源。這個過程不需要重連和重新做權(quán)限驗證悔详,但是會將連接恢復(fù)到剛剛創(chuàng)建完時的狀態(tài)。
查詢緩存
執(zhí)行過的語句及其結(jié)果可能會以 key-value 對的形式惹挟,被直接緩存在內(nèi)存中茄螃。key 是查詢的語句,value 是查詢的結(jié)果连锯。
不要使用查詢緩存归苍,因為查詢緩存往往弊大于利。
只要有對一個表的更新运怖,這個表上所有的查詢緩存都會被清空拼弃。除非你的業(yè)務(wù)就是有一張靜態(tài)表,很長時間才會更新一次摇展。MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了
建議使用案例:
將參數(shù) query_cache_type 設(shè)置成 DEMAND吻氧,這樣對于默認的 SQL 語句都不使用查詢緩存。
mysql> select SQL_CACHE * from T where ID=10;
分析器
詞法分析 - 識別出里面的字符串分別是什么盯孙,代表什么
語法分析 - 判斷你輸入的這個 SQL 語句是否滿足 MySQL 語法
優(yōu)化器
優(yōu)化器是在表里面有多個索引的時候鲁森,決定使用哪個索引;或者在一個語句有多表關(guān)聯(lián)(join)的時候振惰,決定各個表的連接順序歌溉。
課后練習(xí)題:
如果表 T 中沒有字段 k,而你執(zhí)行了這個語句 select * from T where k=1, 那肯定是會報“不存在這個列”的錯誤: “Unknown column ‘k’ in ‘where clause’”骑晶。你覺得這個錯誤是在我們上面提到的哪個階段報出來的呢痛垛?
分析器,《高性能mysql》里提到解析器和預(yù)處理器桶蛔。
解析器處理語法和解析查詢, 生成一課對應(yīng)的解析樹榜晦。
預(yù)處理器進一步檢查解析樹的合法。比如: 數(shù)據(jù)表和數(shù)據(jù)列是否存在, 別名是否有歧義等羽圃。如果通過則生成新的解析樹乾胶,再提交給優(yōu)化器。