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

1、MySQL邏架構圖

2、鏈接器工做原理刨析

一、鏈接器工做原理圖

 

二、原理圖說明

一、鏈接命令mysql

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

二、查詢連接狀態sql

三、長鏈接端鏈接

一、什麼是長連接?

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

二、什麼是短鏈接?

短鏈接則是指每次執行完不多的幾回查詢就斷開鏈接,下次查詢從新創建一個緩存

三、儘可能使用長連接

創建鏈接的過程一般是比較複雜的,因此我建議你在使用中儘可能減小創建的動做,也就是使用長鏈接bash

3、使用長連接困惑及解決方案

一、爲何MySQL佔用內存漲得特別快

可是所有是用長鏈接後,你可能會發現,有些時候MySQL佔用內存漲得特別快,架構

這是由於MySQL在執行過程當中臨時使用的內存管理在鏈接對象裏面的,這些資源會在鏈接斷開的時候才釋放,性能

因此若是長連接積累下來,可能致使內存佔用大,被系統強行殺掉,從現象看就是MySQL異常重啓了優化

二、如何解決MySQL佔用內存漲得特別快

一、按期斷開長連接,使用一段時間,或者程序裏面判斷執行過一個佔用內存的大查詢後,斷開鏈接,以後要查詢再鏈接spa

二、若是你用的是MySQL5.7或更新版本,能夠在每次執行一個比較大的操做後,經過執行設計

mysql_reset_connection

來從新初始化鏈接資源,這個過程不須要重連或從新作權限驗證,可是會將鏈接回覆到剛剛建立完時的狀態

4、查詢緩存

一、工做流程刨析圖解

 

 

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

二、爲何大多數狀況下比建議使用查詢緩存?

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

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

MySQL提供的按需使用的方式

query_cache_type 設置成 DEMAND

二、肯定須要查詢緩存的語句

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

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

 5、分析器

若是你的語句不對,就會收到「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"的內容

6、優化器

一、優化器的做用

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

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

二、舉例說明

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

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

7、執行器

一、工做原理

 

 

二、舉例說明


一、沒有索引的執行流程

一、調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是否是1,若是不是則跳過,若是是則將這行存在結果集中
二、調用引擎接口取"下一行",重複相同的判斷邏輯,直到取到這個表的最後一行
三、執行器將上述遍及過程當中全部知足條件的行組成的記錄集做爲結果集返回給客戶端。

二、有索引的執行流程

第一調用的是"取知足條件的第一行"這個接口,
以後循環取"知足條件的下一行"

引擎掃描行數跟rows_examined並非徹底相同的

8、思考題

一、題目

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

「Unknown column ‘k’ iin ‘where clause’」。

你以爲這個錯誤是在咱們上面提到的哪一個階段報出來的呢?

二、答案

 

我認爲是優化器的,優化器會進行優化分析,好比用先執行哪一個條件,使用哪一個索引。若是沒有對應的字段就會報錯的,我看其餘評論說是執行器,緣由是這個時候纔打開表獲取數據,可是表的字段不是數據啊,是事先定義好的,因此能夠直接讀取的,不須要打開表。這是個人見解,但願老師點評一下是否正確

 

做者回復: 「不是執行器」這一點,你分析得很好😄

 

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

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

相關文章
相關標籤/搜索