對對于MySQL的日志功能,我們可以完全自己控制到底寫還是不寫。一般來說,binlog我們一般會開啟,而對于慢查詢我們一般會在開發的時候調試和觀 察SQL語句的執行速度。但今天發現一個問題。在使用show variables like 'log%';檢視slow日志是否開啟時,發現為OFF,使用set global log_low_queries=on;成功了。而使用show variales like 'long%'時發現是10,于是想把它修改成1,照葫蘆畫瓢使用set global long_query_time=1,再一次查詢發現還是10。
mysql> show variables like '%quer%';
mysql> show variables like '%long_query_time%';
mysql> set global long_query_time=100;

将MySQL慢查詢日志寫入表的的設定為。set global log_output='TABLE';
和慢查詢相關的還有一個參數是log_queries_not_using_indexes;用來設定是否記錄沒有使用索引的查詢。開啟該查詢後,如果你的日志是記錄到表中的,那麼你每次顯示慢日志語句的時候,從該表中的查詢記錄也會被添加進行。
如果日志是寫在檔案中。用mysqldumpslow工具可以對慢查詢日志檔案進行浏覽。
通過show variables like xxx 詳解mysql運作時參數
1, 檢視MySQL伺服器配置資訊
Java代碼
mysql> show variables;
2, 檢視MySQL伺服器運作的各種狀态值
mysql> show global status;
3, 慢查詢
mysql> show variables like '%slow%';
+------------------+-------+
| Variable_name | Value |
| log_slow_queries | OFF |
| slow_launch_time | 2 |
mysql> show global status like '%slow%';
+---------------------+-------+
| Variable_name | Value |
| Slow_launch_threads | 0 |
| Slow_queries | 279 |
配置中關閉了記錄慢查詢(最好是打開,友善優化),超過2秒即為慢查詢,一共有279條慢查詢
4, 連接配接數
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
| max_connections | 500 |
mysql> show global status like 'max_used_connections';
+----------------------+-------+
| Variable_name | Value |
| Max_used_connections | 498 |
設定的最大連接配接數是500,而響應的連接配接數是498
max_used_connections / max_connections * 100% = 99.6% (理想值 ≈ 85%)
5, key_buffer_size
key_buffer_size是對MyISAM表性能影響最大的一個參數, 不過資料庫中多為Innodb
mysql> show variables like 'key_buffer_size';
+-----------------+----------+
| Variable_name | Value |
| key_buffer_size | 67108864 |
mysql> show global status like 'key_read%';
+-------------------+----------+
| Variable_name | Value |
| Key_read_requests | 25629497 |
| Key_reads | 66071 |
一共有25629497個索引讀取請求,有66071個請求在記憶體中沒有找到直接從硬碟讀取索引,計算索引未命中緩存的機率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100% =0.27%
需要适當加大key_buffer_size
mysql> show global status like 'key_blocks_u%';
+-------------------+-------+
| Variable_name | Value |
| Key_blocks_unused | 10285 |
| Key_blocks_used | 47705 |
Key_blocks_unused表示未使用的緩存簇(blocks)數,Key_blocks_used表示曾經用到的最大的blocks數
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 18% (理想值 ≈ 80%)
6, 臨時表
mysql> show global status like 'created_tmp%';
+-------------------------+---------+
| Variable_name | Value |
| Created_tmp_disk_tables | 4184337 |
| Created_tmp_files | 4124 |
| Created_tmp_tables | 4215028 |
每次建立臨時表,Created_tmp_tables增加,如果是在磁盤上建立臨時表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務建立的臨時檔案檔案數:
Created_tmp_disk_tables / Created_tmp_tables * 100% = 99% (理想值<= 25%)
mysql> show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
+---------------------+-----------+
| Variable_name | Value |
| max_heap_table_size | 134217728 |
| tmp_table_size | 134217728 |
需要增加tmp_table_size
7,open table 的情況
mysql> show global status like 'open%tables%';
+---------------+-------+
| Variable_name | Value |
| Open_tables | 1024 |
| Opened_tables | 1465 |
Open_tables 表示打開表的數量,Opened_tables表示打開過的表數量,如果Opened_tables數量過大,說明配置中 table_cache(5.1.3之後這個值叫做table_open_cache)值可能太小,我們查詢一下伺服器table_cache值
mysql> show variables like 'table_cache';
| table_cache | 1024 |
Open_tables / Opened_tables * 100% =69% 理想值 (>= 85%)
Open_tables / table_cache * 100% = 100% 理想值 (<= 95%)
8, 程序使用情況
mysql> show global status like 'Thread%';
| Threads_cached | 31 |
| Threads_connected | 239 |
| Threads_created | 2914 |
| Threads_running | 4 |
如果我們在MySQL伺服器配置檔案中設定了thread_cache_size,當用戶端斷開之後,伺服器處理此客戶的線程将會緩存起來以響 應下一個客戶而不是銷毀(前提是緩存數未達上限)。Threads_created表示建立過的線程數,如果發現Threads_created值過大的 話,表明 MySQL伺服器一直在建立線程,這也是比較耗資源,可以适當增加配置檔案中thread_cache_size值,查詢伺服器 thread_cache_size配置:
mysql> show variables like 'thread_cache_size';
| thread_cache_size | 32 |
9, 查詢緩存(query cache)
mysql> show global status like 'qcache%';
+-------------------------+----------+
| Variable_name | Value |
| Qcache_free_blocks | 2226 |
| Qcache_free_memory | 10794944 |
| Qcache_hits | 5385458 |
| Qcache_inserts | 1806301 |
| Qcache_lowmem_prunes | 433101 |
| Qcache_not_cached | 4429464 |
| Qcache_queries_in_cache | 7168 |
| Qcache_total_blocks | 16820 |
Qcache_free_blocks:緩存中相鄰記憶體塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,進而得到一個空閑塊。
Qcache_free_memory:緩存中的空閑記憶體。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。
Qcache_lowmem_prunes: 緩存出現記憶體不足并且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者記憶體 很少。(上面的 free_blocks和free_memory可以告訴您屬于哪種情況)
Qcache_not_cached:不适合進行緩存的查詢的數量,通常是由于這些查詢不是 SELECT 語句或者用了now()之類的函數。
Qcache_queries_in_cache:目前緩存的查詢(和響應)的數量。
Qcache_total_blocks:緩存中塊的數量。
我們再查詢一下伺服器關于query_cache的配置:
mysql> show variables like 'query_cache%';
+------------------------------+----------+
| Variable_name | Value |
| query_cache_limit | 33554432 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 33554432 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
各字段的解釋:
query_cache_limit:超過此大小的查詢将不緩存
query_cache_min_res_unit:緩存塊的最小大小
query_cache_size:查詢緩存大小
query_cache_type:緩存類型,決定緩存什麼樣的查詢,示例中表示不緩存 select sql_no_cache 查詢
query_cache_wlock_invalidate:當有其他用戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否傳回cache結果還是等寫操作完成再讀表擷取結果。
query_cache_min_res_unit的配置是一柄”雙刃劍”,預設是4KB,設定值大對大資料查詢有好處,但如果你的查詢都是小資料查詢,就容易造成記憶體碎片和浪費。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小資料量的話。
查詢緩存使用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查詢緩存使用率在25%以下的話說明query_cache_size設定的過大,可适當減小;查詢緩存使用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
示例伺服器 查詢緩存碎片率 = 20.46%,查詢緩存使用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
10,排序使用情況
mysql> show global status like 'sort%';
| Sort_merge_passes | 2136 |
| Sort_range | 81888 |
| Sort_rows | 35918141 |
| Sort_scan | 55269 |
Sort_merge_passes 包括兩步。MySQL 首先會嘗試在記憶體中做排序,使用的記憶體大小由系統變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到記憶體中,MySQL 就會把每次在記憶體中排序的結果存到臨時檔案中,等 MySQL 找到所有記錄之後,再把臨時檔案中的記錄做一次排序。這再次排序就會增加 Sort_merge_passes。實際上,MySQL 會用另一個臨時檔案來存再次排序的結果,是以通常會看到 Sort_merge_passes 增加的數值是建臨時檔案數的兩倍。因為用到了臨時檔案,是以速度可能會比較慢,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 建立臨時檔案的次數。但盲目的增加 Sort_buffer_size 并不一定能提高速度,見 How fast can you sort data with MySQL (引自)
另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值對排序的操作也有一點的好處,參見:
11.檔案打開數(open_files)
mysql> show global status like 'open_files';
| Open_files | 821 |
mysql> show variables like 'open_files_limit';
| open_files_limit | 65535 |
比較合适的設定:Open_files / open_files_limit * 100% <= 75%
正常
12。 表鎖情況
mysql> show global status like 'table_locks%';
+-----------------------+---------+
| Variable_name | Value |
| Table_locks_immediate | 4257944 |
| Table_locks_waited | 25182 |
Table_locks_immediate 表示立即釋放表鎖數,Table_locks_waited表示需要等待的表鎖數,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因為InnoDB是行鎖而MyISAM是表鎖,對于高并發寫入的應用InnoDB效果會好些.
13. 表掃描情況
mysql> show global status like 'handler_read%';
+-----------------------+-----------+
| Variable_name | Value |
| Handler_read_first | 108763 |
| Handler_read_key | 92813521 |
| Handler_read_next | 486650793 |
| Handler_read_prev | 688726 |
| Handler_read_rnd | 9321362 |
| Handler_read_rnd_next | 153086384 |
各字段解釋參見,調出伺服器完成的查詢請求次數:
mysql> show global status like 'com_select';
+---------------+---------+
| Variable_name | Value |
| Com_select | 2693147 |
計算表掃描率:
表掃描率 = Handler_read_rnd_next / Com_select
如果表掃描率超過4000,說明進行了太多表掃描,很有可能索引沒有建好,增加read_buffer_size值會有一些好處,但最好不要超過8MB。
本文轉自 念槐聚 部落格園部落格,原文連結:http://www.cnblogs.com/haochuang/p/5162602.html,如需轉載請自行聯系原作者