mysql性能調優

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’ 的出現。

相關文章
相關標籤/搜索