Mysql性能調優
提升Mysql系統的性能,相應速度
替換有問題的硬件(CPU/磁盤/內存等)
服務程序運行參數的調整
對SQL查詢進行優化
一:併發及鏈接控制
鏈接數,鏈接超時
max_connections 容許的最大併發鏈接數
connect_timeout 等待創建鏈接的超時秒數,默認10秒,只在登錄時有效
wait_timeout 等待關閉鏈接的不活動超時秒速,默認28800秒(8小時)
1)查看服務器啓動後已經同時使用的鏈接的最大數量。mysql
mysql> FLUSH STATUS; Query OK, 0 rows affected (0.00 sec) mysql> SHOW GLOBAL STATUS LIKE 'max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 3 | +----------------------+-------+ 1 row in set (0.05 sec)
2)查看當前的最大鏈接數限制sql
mysql> SHOW VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ 1 row in set (0.00 sec)
mysql> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 58 | | Threads_connected | 57 | //這個數值指的是打開的鏈接數 | Threads_created | 3676 | | Threads_running | 4 | //這個數值指的是激活的鏈接數,這個數值通常遠低於connected數值,表明當前併發數。 +-------------------+-------+
顯示當前正在執行的MySQL鏈接vim
show processlist
顯示當前MySQL狀態緩存
mysqladmin -u<user> -p<pwd> -h<host> status // 顯示mysql的其餘狀態 mysqladmin -u<user> -p<pwd> -h<host> extended-status
OS ulimit參數服務器
[root@0087~]# ulimit -n 65535
二:MySQL緩存參數控制
緩衝區,線程數量,開表數量
key_buffer-size 用於MyISAM引擎的關鍵索引緩存大小
sort_buffer_size 爲每一個要排序的線程分配此大小的緩存空間
read_buffer_size 爲順序讀取表記錄保留的緩存大小
read_fnd_buffer_size 爲安排序結果讀取表記錄保留的緩存大小
thread_cache_size 容許保存在緩存中被重用的線程數量
table_open_cache 爲全部線程緩存的打開的表的數量網絡
MySQL緩存參數控制
當 Key_reads / Key_read_requests 較低時,可適當加大key_buffer_size的緩存值,以提升性能。而增大sort_buffer_size的值,能夠顯著提升ORDER和GROUP的響應速度。
1)查看key_read相關數值架構
mysql> SHOW GLOBAL STATUS LIKE 'key_read%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Key_read_requests | 0 | | Key_reads | 0 | +-------------------+-------+ 2 rows in set (0.00 sec)
2)查看當前的key_buffer_size緩存大小併發
mysql> SHOW VARIABLES LIKE 'key_buffer_size'; +-----------------+---------+ | Variable_name | Value | +-----------------+---------+ | key_buffer_size | 8388608 | +-----------------+---------+ 1 row in set (0.03 sec)
3)查看當前的sort_buffer_size大小工具
mysql> SHOW VARIABLES LIKE 'sort_buffer_size'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | sort_buffer_size | 262144 | +------------------+--------+ 1 row in set (0.00 sec)
4)查看檢索表記錄時的讀取緩存大小
緩存值read_buffer_size和read_rnd_buffer_size會影響SQL查詢的響應速度:性能
mysql> SHOW VARIABLES LIKE 'read_%_size'; +----------------------+--------+ | Variable_name | Value | +----------------------+--------+ | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | +----------------------+--------+ 2 rows in set (0.00 sec)
三:MySQL線程重用和開表控制
分析「已打開表的數量/當前可緩存表的數量」,比值不超過95%就基本正常。
1)查看當前已打開、一共打開過多少個表
mysql> SHOW GLOBAL STATUS LIKE 'open%tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 23 | | Opened_tables | 72 | +---------------+-------+ 2 rows in set (0.01 sec)
2)查看當前可緩存多少個打開的表
mysql> SHOW VARIABLES LIKE 'table_open_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | table_open_cache | 2000 | +------------------+-------+ 1 row in set (0.00 sec)
四:SQL查詢優化
經常使用日誌種類及選項
類型 | 用途 | 配置 |
錯誤日誌 | 記錄啓動/運行/中止過程當中的錯誤信息 | log-error[=name] |
查詢日誌 | 記錄客戶端鏈接和查詢操做 | general-log,general-log-file= |
慢查詢日誌 | 記錄耗時較長或不使用索引的查詢操做 | slow-query-log,slow-query-log-file=,long-query-time= |
優化SQL查詢
記錄慢查詢
選項 | 含義 |
slow-query-log | 啓用慢查詢 |
slow-query-log-file | 制定慢查詢日誌文件 |
long-query-time | 指定超時時間(默認10秒)的查詢纔會被記錄 |
log-queries-not-using-indexes | 記錄未使用索引的查詢 |
1)調整my.cnf配置文件,啓用慢查詢
[root@dbsvr1 ~]# vim /etc/my.cnf [mysqld] .. .. slow_query_log=1 //啓用慢查詢 slow_query_log_file=mysql-slow.log //制定慢查詢日誌文件 long_query_time=5 //查詢耗時超過5秒才記錄 log_queries_not_using_indexes=1 //記錄未使用索引的查詢 [root@dbsvr1 ~]# service mysql restart Shutting down MySQL..... [肯定] Starting MySQL.... [肯定]
2)查看慢查詢日誌(mysqldumpslow工具)
[root@dbsvr1 ~]# mysqldumpslow /var/lib/mysql/mysql-slow.log Reading mysql slow query log from /var/lib/mysql/mysql-slow.log Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts .. ..
3)瞭解與查詢相關的緩存選項
查看當前的查詢緩存大小:
mysql> SHOW VARIABLES LIKE 'query_cache%'; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | query_cache_limit | 1048576 | //超過此大小則再也不緩存 | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | //緩存空間的大小 | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ 5 rows in set (0.00 sec)
查看當前的查詢緩存統計數據:
mysql> SHOW GLOBAL STATUS LIKE 'qcache%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031368 | //緩存中的空閒內存 | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 100 | //不適合緩存的數量 | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+---------+ 8 rows in set (0.00 sec)
五:關於MySQL狀態和相關變量的查看
1)查看服務器的相關狀態值(運行中動態變化)
使用SHOW GLOBAL STATUS語句,可結合LIKE條件作模糊過濾。
默認有400多個狀態值:
mysql> SHOW GLOBAL STATUS\G *************************** 1. row *************************** Variable_name: Aborted_clients Value: 0 *************************** 2. row *************************** Variable_name: Aborted_connects Value: 0 *************************** 3. row *************************** Variable_name: Binlog_cache_disk_use Value: 0 .. .. //省略中間的大量狀態值 .. .. *************************** 438. row *************************** Variable_name: Uptime Value: 5322 *************************** 439. row *************************** Variable_name: Uptime_since_flush_status Value: 2283 439 rows in set (0.00 sec)
2)查看服務器的運行選項(通常爲靜態限制,可經過my.cnf文件配置,或SET修改)
使用SHOW VARIABLES語句,也可結合LIKE條件作模糊過濾。
默認也有400多個(接近500個)配置選項:
mysql> SHOW VARIABLES\G *************************** 1. row *************************** Variable_name: auto_increment_increment Value: 1 *************************** 2. row *************************** Variable_name: auto_increment_offset Value: 1 .. .. //省略中間的大量狀態值 .. .. *************************** 489. row *************************** Variable_name: wait_timeout Value: 28800 *************************** 490. row *************************** Variable_name: warning_count Value: 0 490 rows in set (0.01 sec)
查看行鎖等待數量
show status like 'innodb_row_lock_current_waits';
系統啓動後到如今總共等待的次數
show status like 'innodb_row_lock_waits';
查看錶鎖等待的數量
show status like 'table%';
查看隔離事務默認的選項
show variables like 'tx_isolation';
調優思路總結
辦法 | 具體操做 |
升級硬件 | CPU/內存/硬盤 |
加大網絡帶寬 | 付費加大帶寬 |
調整mysql服務運行參數 | 併發鏈接數,鏈接超時時間,重複使用的線程數 |
調整查詢相關的參數 | 查詢緩存,索引緩存 |
啓用慢查詢日誌 | slow-query-log |
網絡架構不合理 | 調整網絡架構 |
優化總結:1.任何狀況下SELECT COUNT(*) FROM tablename是最優選擇;2.儘可能減小SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 這種查詢;3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出現。