01 | 基礎架構:一條SQL查詢語句是如何執行的?

taotaoo發表於2019-03-26

下面我給出的是 MySQL 的基本架構示意圖,從中你可以清楚地看到 SQL 語句在 MySQL 的各個功能模組中的執行過程。

img

從圖中可以看出,不同的儲存引擎公用一個server層。

聯結器

  • 連線命令

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

  • 連線保持時間

    • 連線完成之後,如果沒有後續的動作,這個連線就會處於空閒狀態,可以在show processlist命令中看到。
    • 客戶端如果太長時間沒有動靜,聯結器會主動將其斷連。這個引數是wait_timeout控制的,預設時間是8小時。
    • 斷開之後再傳送請求的話,就會收到一個錯誤提醒:Lost connection to MySQL server during query。需要客戶端重新連線,然後再傳送請求。
  • 長連線佔用記憶體問題

    • 在執行過程中,連線中使用的記憶體是管理在連線物件裡面的。這些資源只有在斷連的時候才會釋放。這些長連線累積下來,可能會導致記憶體佔用越來越大,最終被系統OOM掉。
    • 解決:
      • 定期斷開連線。使用一段時間以後,或者在程式裡面判斷執行過一個比較大的操作之後,重新連線。
      • 或者可以在執行過一個較大的操作之後,執行mysql_reset_connection來重新初始化連線資源。

查詢快取

建立連線之後,進行select語句查詢,就會進入查詢快取階段。每次的查詢會把結果放入快取,下次有相同的查詢會直接在快取中獲取即可,無需進入儲存引擎進行查詢。

但是,查詢快取這個事情是弊大於利的,所以不會建議使用。mysql8.0之後直接將該模組刪除了。

為啥有弊呢?因為每次存在update操作的情況下,就會把整個快取都清除掉,導致快取命中率特別低。

在8.0之前的版本,可以直接將query_cache_type設定為DEMAND,這樣的話,查詢語句預設不使用快取。在需要使用查詢快取的地方可以顯示呼叫。mysql> select SQL_CACHE * from T where ID=10;

分析器

分析器先做“詞法分析”,根據語法規則,判斷輸入的sql語句是否滿足mysql語法規則。

優化器

優化器是在表中存在多個索引的情況下,決定用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連線順序。

執行器

MySQL通過分析器知道了你要做什麼,通過優化器知道了該怎麼做,於是就進入了執行器階段,開始執行語句。

相關文章