show status
或 show 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%'
執行次數查詢