性能測試學習第十天-----性能案例分析之數據庫性能問題

1、現象 /pinter/case/slow?userName=xxx
  tps很低,響應時間很長,數據庫服務器cpu很高(接近100%),應用服務器負載比較低
  索引
  索引是對數據庫表中一列或多列的值進行排序的一種結構,存儲了表中的關鍵字段,使用索引可快速訪問數據庫表中的特定信息。相似於書籍中的目錄。
2、分析mysql

  數據庫服務器CPU高,通常都是由於SQL執行效率低致使的,可能有三方面緣由
    一、數據庫表缺乏必要的索引;
    二、索引不生效
    三、SQL不夠優化nginx

3、慢查詢web

  在MySQL中,能夠監控SQL語句的執行效率,並分析SQL使用索引的狀況,從而協助定位性能問題,慢SQL的配置和抓取配置方法以下:面試

  1 、 開啓 開啓慢 慢 SQL 的配置
  1.1 LIUNX 系統 在 mysql 配置文件 my.cnf 中增長
    slow_query_log
    slow_query_log_file=/usr/local/mysql/data/zhoucentos-slow.log
    long_query_time=0.1
   Slow_query_log 這是一個布爾型變量,默認爲真。沒有這變量,數據庫不會打印慢查詢的日誌。
   log-slow-log_file=/export/servers/mysql/bin/mysql_slow.log (指定日誌文件存放位置,能夠爲空,系統會給一個缺省的文件 host_name-slow.log)
   long_query_time=0.1(記錄超過的時間,默認爲 10s),與 DBA 溝通,性能測試分析問題時能夠將該值設爲 0.1 即 100 毫秒,這樣分析的粒度更詳細。
  備選 :log-queries-not-using-indexes (log 下來沒有使用索引的 query,能夠根據狀況決定是否開啓)。log-long-format (若是設置了,全部沒有使用索引的查詢也將被記錄)
  1.2 Windows 下配置:  在 my.ini 的[mysqld]添加以下語句:
    log-slow-queries = E:\web\mysql\log\mysqlslowquery.log
    long_query_time = 0.1(其餘參數如上)
    注: 配置完成後,從新 mysql 服務配置才能生效。
  2 、 慢查詢開啓與關閉
  2.1 配置完成,鏈接數據庫檢查慢查詢日誌是否開啓:
    命令以下:mysql> show variables like '%slow_query_log%';
  2.2 若是沒有打開,請開啓,slow_query_log
    開啓命令:mysql> set @@global.slow_query_log = on;
    關閉命令:mysql> set @@global.slow_query_log = off;
  2.3 再次檢查是否開啓成功:    mysql> show variables like '%slow_query_log%';
  2.4 檢查目錄中是否生成文件:/mysql 目錄下是否存在 mysql_slow.log
    [root@localhost mysql]# ls -l mysql_slow.log
  3 、 慢查詢日誌分析            算法

  3.1 Linux 系統:    sql

    SQL 語句的執行信息數據庫

    經常使用命令,經過 mysqldumpslow –help 查看
     -s,是 order 的排序,主要有 c,t,l,r 和 ac,at,al,ar,分別是按照 query 次數,時間,lock 的時間和返回的記錄數來排序
     -a,倒序排列
     -t,是 top n 的意思,即爲返回前面多少條的數據
     -g,後邊能夠寫一個正則匹配模式,大小寫不敏感的
  例如: mysqldumpslow -s c -t 20 host-slow.log
      mysqldumpslow -s r -t 20 host-slow.log
    上述命令分別能夠看出訪問次數最多的 20 個 sql 語句和返回記錄集最多的 20 個 sql。
  mysqldumpslow -t 10 -s t -g 「left join」 host-slow.log 這個是按照時間返回前 10條裏面含有左鏈接的 sql 語句。
  使用 mysql 自帶命令 mysqldumpslow ,在mysql/bin目錄下執行 mysqldumpslow –s at -t 50 host-slow.log 顯示出耗時最長的 50 個,注意慢查詢日誌log路徑帶全
  以 Count: 32 Time=0.26s (8s) Lock=0.00s (0s) Rows=10.0 (320),
  wos_20120719[wos_20120719]@2host 爲例:
    Count: 32 該 SQL 總共執行 32 次
    Time = 0.26s (8s) 平均每次執行該 SQL 耗時 0.26 秒,總共耗時 32(次)*0.26(秒)=8 秒。
    Lock=0.00s(0s) lock 時間 0 秒
    Rows =10.0(320) 每次執行 SQL 影響數據庫表中的 10 行記錄,總共影響 10(行)*32(次)=320 行記錄
  3.2 Windows 系統:
  當你是第一次開啓 mysql 的慢查詢,會在你指定的目錄下建立這個記錄文件,本文就是mysqlslowquery.log,這個文件的內容大體以下(第一次開啓 MYSQL 慢查詢的狀況下)
  E:\web\mysql\bin\mysqld, Version: 5.4.3-beta-community-log (MySQLCommunity Server (GPL)). started with:TCP Port: 3306, Named Pipe: (null) Time Id Command Argument
  能夠經過以下的命令來查看慢查詢的記錄數:
    mysql> show global status like ‘%slow%’;
    +———————+——-+
    | Variable_name | Value |
    +———————+——-+
    | Slow_launch_threads | 0 |
    | Slow_queries | 0 |
    +———————+——-+後端

4、執行計劃centos

  執行計劃
  在sql語句前加上explain,能夠分析這條sql語句的執行狀況
  explain select * from teacher where
  Type列可能的值
  Const:表中只有一個匹配行,用到primary key或unique key
  Eq_ref:惟一性索引掃描,key的全部部分被鏈接聯接查詢使用,且key是unique或primary key
  ref:非惟一性索引掃描,或只使用了聯合索引的最左前綴
  Range:索引範圍掃描,在索引列上進行給定範圍內的檢索,如between,in(1,100)
  Index:遍歷索引...
  All:全表掃描
  Prossible key:使用哪一個索引能找到行
  Keys:sql語句使用的索引
  rows:mysql 根據索引選擇狀況,估算查找數據所需讀取的行數緩存

5、聯合索引  

  聯合索引,比單個索引性能更好
  一個索引同時做用於多個字段,一個索引建議不超過4個字段
  聯合索引的最左前綴
  聯合索引檢索數據時,會從最左邊開始匹配(忽略sql字段順序),若是匹配不到,就不使用索引
  如:User表有聯合索引my_index(A字段,B字段,C字段)

        

 6、鏈接數  

鏈接數監控命令
show variables like '%connections%'
show status like '%thread%
其中:
Threads_connected 當前打開的鏈接的數量
Threads_cached 線程緩存內的線程的數量
Threads_created 建立的線程數
Threads_running 激活的(非睡眠狀態)線程數
show status like '%connection%'
Connections 試圖鏈接MySQL服務器的次數

7、數據庫架構優化

架構優化
讀寫分離,主從配置
分庫分表,根據一個固定的算法來路由庫名和表名,如id%10,1202922292
user_1
user_2
user_3
...
user_10
硬件調優
使用更好的物理磁盤介質,如SSD、fusionIO卡等

8、SQL優化

常見的一些sql優化方案
一、在 where 及 order by 涉及的列上創建索引,避免全表掃描,索引不要太多,一個表通常不要
超過4個索引
二、避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描
三、查詢語句中不要使用 *,減小內存使用
四、儘可能減小子查詢,使用關聯查詢(left join,right join,inner join)替代
五、減小使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代
六、or 的查詢儘可能用 union或者union all 代替(在確認沒有重複數據或者不用剔除重複數據時,
union all會更好)
七、合理的增長冗餘的字段(減小表的聯接查詢)
八、建表的時候能使用數字類型的字段就使用數字類型(type,status...),數字類型的字段做爲條
件查詢比字符串的快

9、代碼優化

代碼優化原則
一、使用對象池減小對重複對象的建立;
二、調整對後端的鏈接
三、增長本地緩存
四、若是不涉及事務的狀況下,考慮使用Nosql進行存儲
五、一次請求合併屢次操做
六、由串行修改成並行操做
七、同步修改成異步

10、性能瓶頸定位思路(面試必問)

總體思路:從前到後,從表象到內部一、首先排除壓力機自身的問題,如CPU、內存,網絡,腳本編寫等二、監控中間件的訪問日誌,觀察響應時間,大致肯定耗時處於哪一段三、排查網絡問題,監控壓力機到後端服務器的網絡,以及各服務器間的網絡,是否達到網絡上限四、監控服務端全部機器的操做系統負載,如CPU、內存、磁盤、網絡是否達到瓶頸五、監控應用服務器的日誌,查看是否存在ERROR日誌,好比TimeOut或其餘類型報錯六、監控各中間件的鏈接數,如nginx、tomcat、mysql等,是否達到上限七、監控應用程序線程狀態,使用jstack或jvisualvm查看是否有死鎖、阻塞等狀況八、監控應用程序的jvm,使用jstat或者jmap查看GC狀況,是否內存泄漏等九、使用jprofiler監控應用程序,能夠查看耗時比較長的代碼方法十、監控數據庫,是否存在慢查詢,通常數據庫CPU高都是由於SQL語句效率低形成的十一、檢查數據庫執行計劃,是否有全表掃描,以及索引不生效的狀況十二、檢查系統外部依賴狀況,若是外部依賴系統性能差,也會形成本系統性能低1三、對於很差定位的問題,能夠考慮採用模塊隔離法來肯定問題

相關文章
相關標籤/搜索