MySQL實戰45講學習筆記:第一講


一、MySQL邏架構圖

二、連接器工作原理刨析

1、連接器工作原理圖

 

2、原理圖說明

1、連接命令

mysql -h$ip -P$port -u$user -p

2、查詢鏈接狀態

3、長連接端連接

1、什么是長鏈接?

數據庫里面,長連接是連接成功后,如果客戶端持續有請求,則一直使用同一個鏈接。

2、什么是短連接?

短連接則是指每次執行完很少的幾次查詢就斷開連接,下次查詢重新建立一個

3、盡量使用長鏈接

建立連接的過程通常是比較復雜的,所以我建議你在使用中盡量減少建立的動作,也就是使用長連接

三、使用長鏈接困惑及解決方案

1、為什么MySQL占用內存漲得特別快

但是全部是用長連接后,你可能會發現,有些時候MySQL占用內存漲得特別快,

這是因為MySQL在執行過程中臨時使用的內存管理在連接對象里面的,這些資源會在連接斷開的時候才釋放,

所以如果長鏈接積累下來,可能導致內存占用大,被系統強行殺掉,從現象看就是MySQL異常重啟了

2、如何解決MySQL占用內存漲得特別快

1、定期斷開長鏈接,使用一段時間,或者程序里面判斷執行過一個占用內存的大查詢后,斷開連接,之后要查詢再連接

2、如果你用的是MySQL5.7或更新版本,可以在每次執行一個比較大的操作后,通過執行

mysql_reset_connection

來重新初始化連接資源,這個過程不需要重連或重新做權限驗證,但是會將連接回復到剛剛創建完時的狀態

四、查詢緩存

1、工作流程刨析圖解

 

 

  1. MySQL拿到一個查詢請求后,會先到查詢緩存看看,之前是不是執行過這條語句,如果有,就直接返回給客戶端
  2. 如果語句不在查詢緩存中,就會繼續后面的執行階段。
  3. 執行完成后,執行結果會被存入查詢緩存中,
  4. 如果查詢命中緩存MySQL不需要執行后面的復雜操作,就可以直接返回結果,這個效率會很高

2、為什么大多數情況下比建議使用查詢緩存?

1、查詢緩存的失效非常頻繁,只要有一個表更新,這個表上所有的查詢緩存都被清空
2、對於更新壓力大的數據庫來說,查詢緩存的命中率會非常低,
3、除非你的業務就是有一張靜態表,很長時間才會更新一次(比如一個系統配置表)

1、默認語句不實用查詢緩存

MySQL提供的按需使用的方式

query_cache_type 設置成 DEMAND

2、確定需要查詢緩存的語句

mysql> select SQL_CACHE * from T where ID=10;

MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,也就是說 8.0 開始徹底沒有這個功能了。

 五、分析器

如果你的語句不對,就會收到“You have an error in your SQL syntax”的錯誤提醒,
比如下面這個語句select 少打了開頭的字母“s”

mysql> elect * from t where ID=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1

一般語法錯誤會提示第一個出現錯誤的位置,所以你要關注的是緊接"use naar"的內容

六、優化器

1、優化器的作用

1、在表里面有多個索引的時候,決定使用哪個索引

2、多表關聯(ioin)的時候,決定各個表的鏈接順序

2、舉例說明

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

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

七、執行器

1、工作原理

 

 

2、舉例說明


1、沒有索引的執行流程

1、調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是不是1,如果不是則跳過,如果是則將這行存在結果集中
2、調用引擎接口取"下一行",重復相同的判斷邏輯,直到取到這個表的最后一行
3、執行器將上述遍布過程中所有滿足條件的行組成的記錄集作為結果集返回給客戶端。

2、有索引的執行流程

第一調用的是"取滿足條件的第一行"這個接口,
之后循環取"滿足條件的下一行"

引擎掃描行數跟rows_examined並不是完全相同的

八、思考題

1、題目

如果表 T 中沒有字段 k,而你執行了這個語句 select* from T where k=1, 那肯定是會報“不存在這個列”的錯誤:

“Unknown column ‘k’ iin ‘where clause’”。

你覺得這個錯誤是在我們上面提到的哪個階段報出來的呢?

2、答案

 

我認為是優化器的,優化器會進行優化分析,比如用先執行哪個條件,使用哪個索引。如果沒有對應的字段就會報錯的,我看其他評論說是執行器,原因是這個時候才打開表獲取數據,但是表的字段不是數據啊,是事先定義好的,所以可以直接讀取的,不需要打開表。這是我的看法,希望老師點評一下是否正確

 

作者回復: “不是執行器”這一點,你分析得很好😄

 

課后答案:分析器。Oracle會在分析階段判斷語句是否正確,表是否存在,列是否存在等。猜測MySQL也這樣。

作者回復: MySQL確實在設計上受Oracle影響頗深。就是這樣哈,分析器做了這個工作。另外有評論里面舉例高性能MySQL 里面概念的同學、說正文里面已經暗示答案的同學,遠程點贊了哈😄😄 就喜歡你們這么機智的回答👍🏿

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM