MySQL 總集(先不分)

show statusshow session status

查看當前MySQL服務器連接的會話狀態變量信息;

show global status

查看全局狀態變量;

flush status

初始化當前會話狀態變量


show variables

查看全局系統變量、會話系統變量和靜態變量等;


MySQL 緩存:

按緩存讀寫功能不同劃分

  • Cache 緩存 (加速讀)
  • Buffer 緩存 (緩沖寫)

按生存周期長短劃分

  • 全局緩存 例如二進制日志 binlog_cache_size
  • 會話緩存 例如結果集緩存 net_buffer_size
  • 臨時緩存 例如select語句中包含的派生表生成的內存臨時表

按存儲引擎實現劃分

  • MySQL 緩存
  • MyISAM 緩存
  • InnoDB 緩存

超時

show variables like '%timeout%'

查看超時相關變量配置

連接超時

  • connect_timeout 建立連接超時
  • wait_timeout 保持睡眠狀態太長,超時
  • interactive_timeout 交互模式下(cmd)保持睡眠狀態太長,超時
  • net_write_timeout 默認60秒 寫超時
  • net_read_timeout 默認30秒 讀超時

InnoDB 鎖等待超時

  • innodb_lock_wait_timeout 默認50秒 設置行級鎖鎖等待時間,超時觸發導致行級鎖鎖等待的SQL語句回滾(若希望整個事務回滾,啟動MySQL時開啟 innodb_rollback_on_timeout 參數)
  • innodb_rollback_on_timeout 默認OFF 回滾上一條導致行級鎖鎖等待的SQL語句, 設置為ON則回滾整個事務

元數據鎖超時 metadata locks

  • lock_wait_timeout 默認值1年 31536000 取值范圍[1, 31536000]

復制連接超時

  • slave_net_timeout 默認3600秒 MySQL主從復制時,從拉取主二進制日志失敗后,等待該設置的時間后,再重連主獲取數據。 設置為30秒,減少網絡問題導致的數據同步延遲。

MyISAM 表的延遲插入超時

  • delayed_insert_timeout

MySQL 連接的優化

連接參數

show variables like '%connect%'

查詢MySQL服務的連接參數信息

  • max_connections 設置最大的并發連接數,擁有SUPER權限的用戶可以在連接數達到最大時依然能建立鏈接。
  • max_user_connections 設置指定的MySQL賬號的最大并發連接數,設置為0表示不限制
  • max_connect_errors 某主機連接到MySQL服務器失敗次數過多,超過該值,服務器會拒絕該主機的連接,除非執行 flush hosts
  • init_connect 客戶機連接服務器時,會先執行 init_connect 參數內設置的SQL語句。SUPER權限的用戶連接不會執行這些SQL語句

連接狀態

show status like '%connections%'

查看當前實例連接MySQL服務的狀態信息

  • Connections Mysq服務從啟動到現在嘗試連接的請求數(包括不能成功建立的連接請求)
  • max_used_connections 表示MySQL服務從啟動到現在,同一時刻并行連接的最大值。如果 max_used_connections 和 max_connections 相同, 則說明 max_connections 設置過低或者服務器負載上限。
  • connection_errors_max_connections 由于MySQL服務器已經達到 max_connections 的上限,連接被拒絕的次數。如果該值過大,則說明 max_connections 設置過低或者服務器負載上限。

連接線程參數

show variables like 'thread%'

查看MySQL連接線程參數信息

  • thread_cache_size 表示當前可用的MySQL連接池大小
  • thread_concurrency 針對Solaris系統設置為CPU核心數的2倍
  • thread_handling 默認為 one-thread-per-connection,值為 no-threads 只能提供一個連接線程
  • thread_stack 默認 192KB, 配置連接線程分配的內存大小用于保存每個連接線程的信息

連接狀態信息

show status like 'Thread%'

查看連接線程的狀態信息

  • Threads_cached 當前線程池的線程數
  • Threads_connected 當前連接數
  • Threads_created 連接線程創建數,該值過大會擴充連接池大小
  • Threads_running 不在睡眠狀態的連接線程數量

連接池的連接命中率 = (Connections - Threads_created)/ connections * 100%

該值較低時,需要增加 thread_cache_size。

連接請求堆棧

show variables like 'back_log'

查詢堆棧中的連接請求(因連接數過大而被塞入)

連接異常

show status like 'Aborted%'

查看連接異常的狀態信息

  • Aborted_clients MySQL客戶機被異常關閉的次數。例如發送的SQL語句過長或者select語句執行結果太大,超過 max_allowed_packet 參數值,或者 wait_timeout、 interactive_timeout ( max_allowed_packet 默認 1M)
  • Aborted_connects 試圖連接到MySQL服務器而失敗的連接次數,該次數過大可能有網絡問題。錯誤的賬戶名密碼或者無效的數據庫都會使得該值遞增。

其他

show status like 'Slow%'

查看其他鏈接狀態

  • Slow_launch_threads 記錄創建時間超過 slow_launch_time 的線程數,如果該值過大,可能是服務器過載。 (默認情況下, slow_launch_time 為 2秒)

show status like 'Connection_error%'

查看連接錯誤的狀態統計信息


緩存的優化

show variables like 'host_cache_size'

查詢主機名緩存大小

show variables like 'stored_program_cache'

查看MySQL為每個會話提供的存儲程序緩存個數上限

show variables like 'innodb_ft_cache_size'

查詢InnoDB 全文索引緩存的大小

查詢緩存 Query Cache

show variables like '%query_cache%'

查詢有關查詢緩存的參數設置

  • have_query_cache 是否支持查詢緩存 YES NO
  • query_cache_type 0(OFF) 關閉,1(ON)先到查詢緩存中查找,除非
    select 語句中包含 sql_no_cache, 2(DEMOND)不使用查詢緩存,除非 select 語句中包含 sql_cache
  • query_cache_size 查詢緩存的大小
  • query_cache_limit 如果 select 語句的結果集大小超過了該值,將不會被添加進查詢緩存
  • query_cache_min_res_unit 查詢緩存是以塊為單位分配內存空間,結果集大于該值就會多申請一塊,如此反復。合適的值不僅可以減少內存分配操作的次數,還可以減少內存碎片
  • query_cache_wlock_invalidate 用于設置行級排他鎖與查詢緩存之間的關系,默認 0 (false),表示施加行級排他鎖時,該表的所有查詢緩存依然有效。如果設置為1(true),表示施加行級排他鎖時,該表的所有查詢緩存將失效。

查詢緩存的命中率

set global query_cache_size = 102760448

開啟緩存查詢,將其內存大小設置為98M

show status like 'Qcache%'

獲取當前實例的查詢緩存狀態,從而可以計算出當前緩存查詢的命中率,繼而確定 query_cache_size 的設置是否合理

  • Qcache_free_memory 當前可用內存
  • Qcache_lowmen_prunes 因查詢緩存已滿而溢出、刪除的查詢結果個數。該值過大表示需要增加查詢緩存大小
  • Qcache_hits 使用查詢緩存的次數,若該值過小,則考慮是否應該開啟查詢緩存
  • Qcache_total_blocks 查詢緩存的總塊數
  • Qcache_free_blocks 處于空閑的塊數(碎片數量)如果該值較大,意味著查詢緩存中碎片較多,表明查詢結果集比較小,此時可以減少 query_cache_min_res_unit。使用 flush query cache 對碎片進行整理。(reset query cache 會移除查詢緩存中的結果集)
  • Qcache_inserts 表示此前總共緩存過多少條 select語句的結果集
  • Qcache_not_cached 表示沒有進入查詢緩存的 select語句的個數
  • Qcache_queries_in_cache 表示查詢緩存中緩存中多少條 select 語句的結果集

結果集緩存

select 語句的結果集會暫存在結果集緩存中,結果集緩存的初始大小由 net_buffer_size 定義(默認16KB),如果 select語句的結果集大小超過初始大小,則會自動擴容,但不會超過 max_allowed_packet 的參數值。select 語句執行成功后,結果集緩存空間會“瘦身”到初始大小。

優化表結構

  • 盡量將字段定義為 NOT NULL
  • 考慮使用 enum、 set等復合數據類型
  • 盡量不存文件、視頻等二進制數據
  • 數值型字段的比較比字符串效率高很多

SQL語句優化

了解 SQL 的執行頻率

show status like 'queries'

執行的 SQL 語句的數量,不統計 com_ping、com_statistics

show global status like 'Com_%'

查看MySQL服務執行各種SQL語句的數量

  • com_select
  • com_insert 批量插入只記一次
  • com_update
  • com_delete

可以通過上面的信息了解當前應用偏向于 OLTP 還是 OLAP。

  • com_commit
  • com_rollback

可以通過上面信息,了解到rollback從而推斷程序中存在某些問題。

數據處理狀態信息

show global status like 'handler%'

執行次數查詢

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容