mysql性能優化系列1-mysql架構

1. mysql性能指標

mysql性能中有兩個重要性能指標:TPS和QPS。
(1)TPS
TPS(Transactions Per Second)是指服務器每秒處理的事務數。不過有的存儲引擎不支持事務,無法用這個指標衡量。
TPS = (COM_COMMIT + COM_ROLLBACK)/UPTIME
(2) QPS
QPS(Queries Per Second)是指每秒查詢處理量。
QPS=QUESTIONS/UPTIME
(3)等待時間(UPTIME)
指執行Sql語句等待返回結果之間的等待時間

2. MySQLSlap

MySQLSlap是mysql官方提供的性能壓測工具,語法是mysqlslap [options]。
常用options參數說明:

  • create-schema=name:指定測試的數據庫名
  • engine=name:創建測試表所使用的存儲引擎,可指定多個
  • concurrency=N:模擬N個客戶端併發執行,可指定多個值
  • number-of-queries=N:總的測試查詢次數(併發客戶數×每客戶查詢次數)
  • iterations=N :迭代執行的次數,即重複的次數(相同的測試進行N次,求一個平均值),這裏指整個過程的重複次數,包括準備數據、測試load、清理
  • commit=N:執行N條DML後提交一次
  • auto-generate-sql, -a :自動生成測試表和數據,用mysqlslap工具自己生成的SQL腳本來測試併發壓力
  • auto-generate-sql-load-type=name:要測試的環境是讀操作還是寫操作還是兩者混合的。read、 write、 key (read primary keys)、 update (update primary keys), or mixed (half inserts, half scanning selects),默認值是:mixed
  • auto-generate-sql-add-auto-increment:對生成的表自動添加auto_increment列
  • number-char-cols=name:自動生成的測試表中包含N個字符類型的列,默認1個
  • number-int-cols=name:自動生成的測試表中包含N個數字類型的列,默認1個
  • debug-info:打印內存和CPU的信息

3. MySql邏輯架構

(1)邏輯模塊
在這裏插入圖片描述

  • Management Services&Utilities:服務管理和控制,主要用來回滾操作、恢復數據、數據的複製、遷移、元數據的管理等
  • Connection Pool:連接池,主要用來管理用戶連接,接收客戶端請求並轉發到相應的線程管理模塊,對連接的進行權限認證
  • SQLInterface:SQL接口,用來接收管理SQL命令,存儲過程,視圖,觸發器等
  • Parser:解析器,對SQL命令進行驗證和解析。包括對SQL語句進行語義和語法的分析,分解成數據結構,然後按照不同的操作類型轉發到後續步驟。如果在分解成數據結構中遇到錯誤,說明這個sql語句非法
  • Optimize:查詢優化器,優化SQL語句,以最優策略去執行該SQL命令
  • Cache&Buffer:查詢緩存,將SQL查詢結果緩存到內存中,並與該查詢的一個hash 值做對應。該查詢結果數據的基表發生任何數據的變化之後,會自動使該查詢對應的緩存失效。這個緩存機制是由一系列小緩存組成,比如表緩存,記錄緩存,key緩存,權限緩存等
  • 存儲引擎:MySQL的存儲引擎是基於表的,每個表可選擇各自的存儲引擎

(2)邏輯架構
在這裏插入圖片描述
邏輯架構分爲三層,連接層、SQL處理層、數據存儲層。

  • 連接層:管理客戶端的連接、對連接進行授權認證等。 MySQL啓動後,每一個客戶端發起連接請求,服務器都會新建一個線程處理(如果是線程池,則分配一個空閒線程),每個線程獨立,擁有各自的內存處理空間。連接到服務器後,服務器需要進行驗證,包括用戶名密碼、IP驗證,是否具有執行某個特定查詢的權限驗證
  • SQL處理層:對SQL語句的解析、優化,管理緩存的查詢,MySQL內置函數的實現,跨存儲引擎功能,比如存儲過程、觸發器、視圖等
  • 數據存儲層:也叫存儲引擎層,負責數據存儲。存儲引擎的不同,存儲方式、數據格式、提取方式等都不相同

(3)SQL執行過程

  • 程序的請求會先通過connectors開始交互,請求到達後會暫存放在連接池connection pool,並由Management Serveices & Utilities管理。當請求從等待隊列進入到處理隊列,管理器會將請求發給SQL Interface
  • SQL接口接收到請求後,將請求進行hash並查詢緩存中是否存在,如果存在直接返回結果
  • 如果上述緩存中不存在,SQL接口將請求發給Parser,Parser會將SQL轉換爲數據結構,如果轉換出錯,則停止處理
  • Parser轉換完後交給Optimizer,Optimizer產生多種執行計劃,並選擇最優化的方案交給存儲引擎
  • 存儲引擎會查詢存儲設備中取得數據,並原路返回給程序

詳細說明

  • MySQL通信協議是半雙工,在任一時刻,要麼是服務器向客戶端發送數據,要麼是客戶端向服務器發送數據。一旦一端開始發送消息,另一端要接收完整個消息才能響應它。客戶端用一個數據包發送請求給服務器,當查詢語句很長需要設置max_allowed_packet參數,如果超出最大參數服務端會拒絕接收數據並拋出異常。服務器響應給用戶的數據通常由多個數據包組成。客戶端必須完整的接收整個返回結果,而不能簡單的只取前面幾條結果,然後讓服務器停止發送
  • 查詢緩存是在解析SQL前,如果查詢緩存是打開的,就基於SQL計算hash值,根據hash值去緩存查詢,如果存在返回結果,SQL不會被解析,不會生成執行計劃。這個哈希值通過查詢本身、查詢的數據庫、客戶端協議版本號等信息計算得來。如果查詢中包含用戶自定義函數、存儲函數、用戶變量、臨時表、MySQL系統表,查詢結果都不會被緩存。
    MySQL查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表的數據或結構發生變化,那麼和表相關的所有緩存數據都將失效。
    服務器緩存參數:query_cache_limit表示超出此大小的查詢將不被緩存,
    query_cache_min_res_unit表示緩存塊的最小值。query_cache_size表示查詢緩存大小。
    query_cache_type表示緩存類型(0:禁用,1:緩存所有結果,DENAND:只緩存select語句中有SQL_CACHE指定)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章