熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

一次MySQL性能優化實戰

2022-06-13   來源: MySQL 

  過年這段時間由於線上數據庫經常壓力過大導致響應非常緩慢甚至死機咬咬牙下大決心來解決效率不高的問題!

  首先是由於公司秉承快速開發原則頻繁上線導致每次忽視了性能問題!日積月累所以導致系統越來越慢所以如果你的系統查詢語句本來就優化的很好了可能參考意義不大!

  提取慢查詢日志文件應該在你的DataDir目錄下面

  通過程序處理慢查詢文件將文件格式的慢查詢導入到數據庫中

     mysql> desc slow_query;
+++++++
| Field         | Type        | Null | Key | Default | Extra |
+++++++
| Date          | varchar() | NO   |     |         |       | 查詢發生的時間
| user          | varchar() | NO   |     |         |       |
| host          | varchar() | NO   |     |         |       |
| content       | text        | NO   |     |         |       | 將Statement進行Mask後的語句便於Group By
| query_time    | int()     | NO   |     |         |       | 查詢所用時間直接性能指標
| lock_time     | int()     | YES  |     |        |       | 等待鎖定的時間
| rows_sent     | int()     | YES  |     |        |       | 返回的結果行數
| rows_examined | int()     | YES  |     |        |       | 掃描行數(很重要上萬以後就要重點注意了
| statement     | text        | YES  |     | NULL    |       | 實際查詢語句
+++++++
    
    然後發揮您的想象力在這個表中盡力捕捉你想捕捉的那類型語句壓力最大掃描行數最多等鎖最久……

  比如

  優化後

     mysql> select sum(query_time)/count(*)count
(*)sum(query_time)min(Date)Max(Date) from slow where Date> :: and  Date< ::;
++++++
| sum(query_time)/count(*) | count(*) | sum(query_time) | min(Date)           | Max(Date)           |
++++++
|                   |     |           | :: | :: |
++++++
row in set ( sec)
    
    優化前
   
  mysql> select sum(query_time)/count(*)count(*)sum(query_time)min(Date)Max(Date) from slow where Date> :: and  Date< ::;
++++++
| sum(query_time)/count(*) | count(*) | sum(query_time) | min(Date)           | Max(Date)           |
++++++
|                   |     |           | :: | :: |
++++++
row in set ( sec)
    
    再比如優化前

  基本信息

  慢查詢統計從 :: ::時間段接近個小時的數據;

  總共有慢查詢平均一小時有個慢查詢;(花了一天優化降到每小時個的樣子了成就感啊)

  所有慢查詢耗費總時間秒;

  慢查詢時間設置是大於

  參數說明

  sum總執行時間(秒);

  count執行次數;

  avg平均執行時間(秒);

  content類似SQL語句的表達通式其中DD代表數字;

  statement某一條具體執行的SQL語句

  由於訪問時的鎖導致update非常慢

     mysql> select count(*) as nsum(query_time) as s sum(query_time)/count(*) as avgsubstring_index(statement ) as u from slow where statement like update% and query_time> group by u;
+++++
| n   | s    | avg     | u                        |
+++++
|   |   | | update conversation      |
| | | | update user              |
|   |   | | update user_modification |
+++++
    
    說明程序中還是存在一些忘記釋放事務鎖的情況

  最耗費資源的個查詢

  其中第應該是同一類查詢這樣的話這一類查詢占總查詢的一半以上每分鐘出現個以上這樣的慢查詢需要重點解決!

     mysql> select sum(query_time) as sum count(*) as count sum(query_time)/count(*) as avgstatement from slow wher
e host like %% group by content order by sum desc limit \G
*************************** row ***************************
      sum:
    count:
      avg:
…………
    
   


From:http://tw.wingwit.com/Article/program/MySQL/201311/29467.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.