學習筆記:非原著 ...
1、mysql可分為server層和存儲引擎
1.1 server層:
連接器、查詢緩存、分析器、優化器 、執行器、包含所有內置函數(日期,時間,數學、加密函數),所有跨存儲引擎的功能都在此層,比如存儲過程、觸發器、視圖等
1.1.1 連接器:
負責跟客戶端建立連接、獲取許可權、維持和管理連接
mysql -h$host -P$port -u$user -p$password
備註:
a、sleep狀態是連接完成,但沒有後續操作,此連接就會處於空閑狀態;
b、如果在連接過程中對當前用戶的許可權做了修改,也需要在斷開重新連接之後此許可權才生效;
c、長連接與短連接:長連接使用過多會出現mysql記憶體占用過高導致mysql異常重啟的情況,解決方法可以是:定期斷開長連接,5.7及以上,則可以通過mysql_reset_connection來重新初始化連接緩存,這個過程不會重連和重新做許可權驗證,但會恢復到剛剛創建完的狀態;
1.1.2 查詢緩存:
a. 建立連接之後便會去查詢緩存,緩存會以key-value對的形式保存,key是查詢語句,value是查詢結果。若查詢命中緩存,則不需要後續複雜的邏輯。
b. 但查詢緩存的失效特別頻繁,只要有對一個表的更新,那麼此表的緩存就會全部清空,因此不建議使用查詢緩存。除非是表的數據變動頻率不高的,如系統配置表
c.5.8.0已完全將查詢緩存模塊刪掉
1.1.3 分析器:內建解析樹,數據表和數據列是否存在, 別名是否有歧義,如果通過建立一個新的解析樹,再提交給優化器
a.詞法分析、語法分析
1.1.4 優化器
優化器決定最優sql執行順序,如最優索引,join表的順序等
1.1.5 執行器
查詢對當前表是否有執行許可權,若有許可權,打開表,根據表引擎介面執行sql
1.2 存儲引擎負責數據的存儲和提取,包含InnoDB,MyISAM,Memry等,mysql5.5.5版本以上預設InnoDB
備註:
1、wait_timeout針對非互動式連接;
interaction_timeout針對互動式連接;
通過mysql客戶端連接資料庫是互動式連接,通過jdbc連接資料庫是非互動式連接;
2、執行完成後寫入緩存
問題:
1、為什麼對許可權的檢查不在優化器之前做?
答:觸發器是在執行器階段確定的
2、我創建了一個沒有select許可權的用戶,執行select * from T where k=1,報錯“select command denied”,並沒有報錯“unknown column”,是不是可以說明是在打開表之後才判斷讀取的列不存在?
答:這是一個安全問題,當既沒有查詢許可權,where條件的欄位不存在時,未避免泄露太多信心,會直接判斷無許可權
3、分析器到查詢緩存的那個箭頭表示什麼意思?
答:更新完回來失效緩存;
4、基本架構圖中,分析器指向了查詢緩存,是這時候把KEY放入緩存的嗎?執行器不指向緩存Value是什麼時候放入緩存的?
答:其實執行完會寫入,避免圖亂,箭頭去掉了,文中:執行完成後,結果寫入查詢緩存;
學習筆記:非原著