MySql 實戰45講筆記 01

2022-09-14 20:57:28 字數 1861 閱讀 8336

一般來說 mysql 分為server 層以及儲存引擎層兩部分

聯結器聯結器負責跟客戶端建立連線、獲得許可權、位置和管理連線。連線命令一般是這麼寫的。

mysql -h$ip -p$port -u$user -p
輸完命令之後,你就需要在互動對話裡面輸入密碼。雖然密碼也可以直接跟在-p後面寫在命令列中,但這樣可能會導致你的密碼洩露。如果你連的是生產伺服器,強烈建議你不要這麼做。

乙個使用者成功建立連線後,即使你用管理員賬號對這個使用者的許可權做了修改,也不會影響已經存在連線的許可權。修改完成後,只有再新建的連線才會使用新的許可權設定。

客戶端如果太長時間沒動靜,聯結器就會自動將它斷開。這個時間是由引數wait_timeout控制的,預設值是8小時。

資料庫裡面,長連線是指連線成功後,如果客戶端持續有請求,則一直使用同乙個連線。短連線則是指每次執行完很少的幾次查詢就斷開連線,下次查詢再重新建立乙個。

但是全部使用長連線後,你可能會發現,有些時候mysql占用記憶體漲得特別快,這是因為mysql在執行過程中臨時使用的記憶體是管理在連線物件裡面的。這些資源會在連線斷開的時候才釋放。所以如果長連線累積下來,可能導致記憶體占用太大,被系統強行殺掉(oom),從現象看就是mysql異常重啟了。

查詢快取

連線建立完成後,你就可以執行select語句了。執行邏輯就會來到第二步:查詢快取。

mysql拿到乙個查詢請求後,會先到查詢快取看看,之前是不是執行過這條語句。之前執行過的語句及其結果可能會以key-value對的形式,被直接快取在記憶體中。key是查詢的語句,value是查詢的結果。如果你的查詢能夠直接在這個快取中找到key,那麼這個value就會被直接返回給客戶端。

但是大多數情況下我會建議你不要使用查詢快取,為什麼呢?因為查詢快取往往弊大於利。

查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。除非你的業務就是有一張靜態表,很長時間才會更新一次。比如,乙個系統配置表,那這張表上的查詢才適合使用查詢快取。需要注意的是,mysql 8.0版本直接將查詢快取的整塊功能刪掉了,也就是說8.0開始徹底沒有這個功能了。

分析器分析器先會做「詞法分析」,根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這個sql語句是否滿足mysql語法。

優化器優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有多表關聯(join)的時候,決定各個表的連線順序。

mysql> select * from t1 join t2 using(id)  where t1.c=10 and t2.d=20;
既可以先從表t1裡面取出c=10的記錄的id值,再根據id值關聯到表t2,再判斷t2裡面d的值是否等於20。

也可以先從表t2裡面取出d=20的記錄的id值,再根據id值關聯到t1,再判斷t1裡面c的值是否等於10。

這兩種執行方法的邏輯結果是一樣的,但是執行的效率會有不同,而優化器的作用就是決定選擇使用哪乙個方案。

執行器

mysql> select * from t where id=10;

error 1142 (42000): select command denied to user 'b'@'localhost' for table 't'

如果有許可權,就開啟表繼續執行。開啟表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的介面。

比如我們這個例子中的表t中,id欄位沒有索引,那麼執行器的執行流程是這樣的:

對於有索引的表,執行的邏輯也差不多。第一次呼叫的是「取滿足條件的第一行」這個介面,之後迴圈取「滿足條件的下一行」這個介面,這些介面都是引擎中已經定義好的。

實戰mysql45講 MySQL實戰45講

作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...

mysql實戰45講筆記 07

07 行鎖功過 怎麼減少行鎖對效能的影響 mysql的行鎖是在引擎層由各個引擎自己實現的,不是所有資料庫都支援行鎖比如myisam 行鎖就是針對資料表中行記錄的鎖。在innodb事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻回訪,而是等到事務結束時才釋放,這就是兩階段鎖協議。因此,如果事...

MySQL實戰45講 事物隔離(筆記)

事務就是要保證一組資料庫操作,要麼全部成功,要麼全部失敗。在 mysql 中,事務支援是在引擎層實現的。innodb支援事務。隔離得越嚴實,效率就會越低。在實現上,資料庫裡面會建立乙個檢視,訪問的時候以檢視的邏輯結果為準。在 mysql 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上...