這個專欄的內容是我工作以來看過講mysql最深入而且最細緻的,作者丁奇是前阿里資深技術專家,和褚霸(霸爺)一起研究資料庫7年之久,我覺得很有必要把這個專欄重新讀一下並做好筆記,以求共勉。
特別注意由於丁奇在資料庫領域比較資深,所以很多知識他可能認為你至少應該是了解的,如果完全不了解某個知識點,建議先去網上找找資料,對知識點有個大致的輪廓。
首先是mysql的基本架構示意圖:
image.png
儲存引擎層:
現在最常用的儲存引擎是 innodb,它從 mysql 5.5.5 版本開始成為了預設儲存引擎。
聯結器:
mysql -h$ip -p$port -u$user -p
聯結器判斷使用者名稱和密碼,強烈建議密碼不要直接載入-p後面,不安全。聯結器在連線建立之後授予使用者許可權,就算使用者修改了許可權,本次連線中也不會生效。
客戶端如果太長時間沒動靜,聯結器就會自動將它斷開。這個時間是由引數 wait_timeout 控制的,預設值是 8 小時。
長期使用長連線可能會導致連線物件記憶體暴漲(因為記憶體釋放是在連線斷開之後),如果你用的是 mysql 5.7 或更新版本,可以在每次執行乙個比較大的操作後,通過執行mysql_reset_connection 來重新初始化連線資源。這個過程不需要重連和重新做許可權驗證,但是會將連線恢復到剛剛建立完時的狀態。
查詢快取
執行過的語句及其結果可能會以 key-value 對的形式,被直接快取在記憶體中。key 是查詢的語句,value 是查詢的結果。
不要使用查詢快取,因為查詢快取往往弊大於利。
只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。除非你的業務就是有一張靜態表,很長時間才會更新一次。mysql 8.0 版本直接將查詢快取的整塊功能刪掉了
建議使用案例:
將引數 query_cache_type 設定成 demand,這樣對於預設的 sql 語句都不使用查詢快取。
mysql> select sql_cache * from t where id=10;
分析器詞法分析 - 識別出裡面的字串分別是什麼,代表什麼
語法分析 - 判斷你輸入的這個 sql 語句是否滿足 mysql 語法
優化器優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有多表關聯(join)的時候,決定各個表的連線順序。
課後練習題:
如果表 t 中沒有字段 k,而你執行了這個語句 select * from t where k=1, 那肯定是會報「不存在這個列」的錯誤: 「unknown column 『k』 in 『where clause』」。你覺得這個錯誤是在我們上面提到的哪個階段報出來的呢?
分析器,《高效能mysql》裡提到解析器和預處理器。
解析器處理語法和解析查詢, 生成一課對應的解析樹。
預處理器進一步檢查解析樹的合法。比如: 資料表和資料列是否存在, 別名是否有歧義等。如果通過則生成新的解析樹,再提交給優化器。
丁奇mysql實戰 丁奇 MySQL實戰讀書筆記5
在下面這個表 t 中,如果我執行 select from t where k between 3 and 5,需要執行幾次樹的搜尋操作,會掃瞄多少行?mysql create table t id int primary key,k int not null default 0,s varchar ...
丁奇 mysql 丁奇 MySQL實戰讀書筆記13
1 為啥刪除了表的一半數8據,表文檔案大小沒變化?因為delete 命令其實只是把記錄的位置,或者資料頁標記為了 可復用 但磁碟檔案的大小是不會變的。也可以認為是一種邏輯刪除,所以物理空間沒有實際釋放,只是標記為可復用,表檔案的大小當然是不變的啦!2 表的資料資訊存在 表資料資訊可能較小也可能巨大無...
MySql 丁奇 學習筆記 MVCC
問題0 有如下表結構,分析下面三個事務讀到的資料是甚麼?create table t engine innodb insert into t values 1,1 事務a 事務b事務c start transaction with consistent snapshot start transact...