明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

【MySQL數(shù)據(jù)庫】第3章解讀:服務(wù)器性能剖析(上)

[摘要]前言: 保持空杯精神,使用性能剖析,專注于測(cè)量服務(wù)器的時(shí)間花費(fèi)在哪里,思考1、如何確認(rèn)服務(wù)器是否達(dá)到了性能最佳狀態(tài),2、某條語句為什么不夠快,診斷被用戶描述為“停頓、堆積、卡死”的某些間歇性疑...
前言:

保持空杯精神,使用性能剖析,專注于測(cè)量服務(wù)器的時(shí)間花費(fèi)在哪里,思考1、如何確認(rèn)服務(wù)器是否達(dá)到了性能最佳狀態(tài),2、某條語句為什么不夠快,診斷被用戶描述為“停頓、堆積、卡死”的某些間歇性疑難故障;

接下來將介紹一些工具、技巧優(yōu)化整機(jī)性能、優(yōu)化單條語句執(zhí)行速度,診斷 解決那些很難觀察到的問題,展示如何測(cè)量系統(tǒng)并生成剖析報(bào)告、如何分析系統(tǒng)的堆棧;

3.1簡(jiǎn)介

性能:為完成某件任務(wù)所需要的時(shí)間度量,in other words 性能即響應(yīng)時(shí)間

吞吐量:?jiǎn)挝粫r(shí)間內(nèi)的查詢數(shù)據(jù)(性能定義的倒數(shù))

第一步:弄清楚時(shí)間都去哪了,在哪消耗了時(shí)間

如果通測(cè)量沒有找到答案,測(cè)量方式錯(cuò)了或不夠完善,只測(cè)量需要優(yōu)化的活動(dòng)

不要在錯(cuò)誤的時(shí)間啟動(dòng)或停止測(cè)試,測(cè)量的是聚合后的信息而不是目標(biāo)活動(dòng)本身;需要定位和優(yōu)化子任務(wù)

原則:無法測(cè)量便無法有效地優(yōu)化

3.1.1通過性能剖析進(jìn)行優(yōu)化

性能剖析:測(cè)量、分析時(shí)間花費(fèi)在哪里的主要方法

1、測(cè)量任務(wù)所花費(fèi)的時(shí)間;2、對(duì)結(jié)果統(tǒng)計(jì)、排序(重要前排)

可將相似任務(wù)分組匯總,通過性能剖析報(bào)告獲需要的結(jié)果;報(bào)告會(huì)列出all任務(wù),每行記錄一個(gè)任務(wù):

任務(wù)名、執(zhí)行時(shí)間、消耗時(shí)間、平均執(zhí)行時(shí)間,執(zhí)行占全部時(shí)間的百分比;按照任務(wù)的消耗時(shí)間降序排序;

性能剖析類型:

基于執(zhí)行時(shí)間的分析:什么任務(wù)的執(zhí)行時(shí)間最長(zhǎng)

基于等待的分析:判斷任務(wù)在什么地方唄阻塞的時(shí)間最長(zhǎng)

3.1.2理解性能剖析

性能剖析中缺失但是重要的信息:

1、值得優(yōu)化的查詢

占總響應(yīng)時(shí)間比重很小的查詢不值得優(yōu)化;成本大于收益、停止優(yōu)化

2、異常情況

沒有顯式要優(yōu)化的也要優(yōu)化,如執(zhí)行次數(shù)少但每次都特別慢的任務(wù)

3、未知的未知

丟失時(shí)間:任務(wù)總時(shí)間與實(shí)際測(cè)量到的時(shí)間的差,即使沒有發(fā)現(xiàn)也要注意這類問題存在的可能性

4、被掩藏的細(xì)節(jié)

無法顯示all響應(yīng)時(shí)間的分布,更多信息、直方圖、百分比、標(biāo)準(zhǔn)差、偏差指數(shù)

5、無法再更高層次的堆棧中進(jìn)行交互式 分析

3.2對(duì)應(yīng)用程序進(jìn)行性能剖析:自上而下

性能瓶頸的影響因素:

1、外部資源,調(diào)用外部web服務(wù)或搜索引擎

2、應(yīng)用需要處理大量數(shù)據(jù),分析一個(gè)超大的xml文件

3、循環(huán)中執(zhí)行昂貴的操作:濫用正則

4、使用低效的算法:暴力搜索算法

建議:新的項(xiàng)目中應(yīng)考慮包含性能剖析的代碼

3.2.1測(cè)量PHP應(yīng)用程序:空

3.3剖析MySQL查詢

3.3.1剖析服務(wù)器負(fù)載

鋪獲MySQL查詢到日志文件:

1、慢查詢?nèi)罩荆洪_銷低、精度高,大的磁盤空間,長(zhǎng)期開啟 注意部署日志輪轉(zhuǎn)工具,只在收集負(fù)載樣本期間開啟即可,5.1后微秒級(jí)別;

2、通用日志,查詢請(qǐng)求到服務(wù)器時(shí)進(jìn)行記錄,不包含響應(yīng)時(shí)間和執(zhí)行計(jì)劃

分析查詢?nèi)罩?/h3>

自頂向下,先生成剖析報(bào)告(pt-query-digest),查看特別關(guān)注的部分

3.3.2剖析單條查詢

思考為什么花費(fèi)這么長(zhǎng)時(shí)間、如何去優(yōu)化

使用SHOW PROFILE:MySQL5.1后

查看: show variables like "%pro%";【源】

默認(rèn)禁用,開啟:set profiling=1;然后在服務(wù)器執(zhí)行語句(關(guān)閉 set profiling=off;)

語法:

SHOW PROFILE [type [, type] ... ]  
    [FOR QUERY n]  
    [LIMIT row_count [OFFSET offset]]  
  
type:  
    ALL                --顯示所有的開銷信息  
    BLOCK IO           --顯示塊IO相關(guān)開銷  
    CONTEXT SWITCHES   --上下文切換相關(guān)開銷  
    CPU                --顯示CPU相關(guān)開銷信息  
    IPC                --顯示發(fā)送和接收相關(guān)開銷信息  
    MEMORY             --顯示內(nèi)存相關(guān)開銷信息  
    PAGE FAULTS        --顯示頁面錯(cuò)誤相關(guān)開銷信息  
    SOURCE             --顯示和Source_function,Source_file,Source_line相關(guān)的開銷信息  
    SWAPS              --顯示交換次數(shù)相關(guān)開銷的信息
實(shí)質(zhì)是這些開銷信息被記錄到information_schema.profiling表
show profiles;查看
show profile for query 2; 獲取指定查詢的開銷(第二條查詢開銷明細(xì))
show profile cpu for query 2 ;查看特定部分的開銷,如下為CPU部分的開銷 
show profile block io,cpu for query 2;  同時(shí)查看不同資源開銷

使用SHOW STATUS:計(jì)數(shù)器

全局show global status、基于某個(gè)連接會(huì)話級(jí)別,作用域要注意

計(jì)數(shù)器顯示活動(dòng)的頻繁程度,常用:句柄計(jì)數(shù)器、臨時(shí)文件、表計(jì)數(shù)器

會(huì)創(chuàng)建臨時(shí)表,通過句柄操作(引用、指針?)訪問此臨時(shí)表,影響show status結(jié)果中對(duì)應(yīng)的數(shù)字

使用慢查詢?nèi)罩荆骸驹础俊驹础?/h3>

將MySQL中響應(yīng)時(shí)間超過閾值long_query_time的語句記錄到慢查詢?nèi)罩局校ㄈ罩究梢詫懭胛募蛘邤?shù)據(jù)庫表,如果對(duì)性能要求高的話,建議寫文件),默認(rèn)是10s,需要手動(dòng)開啟

查看:

1.png

(1)slow_query_log的值為ON為開啟慢查詢?nèi)罩荆琌FF則為關(guān)閉慢查詢?nèi)罩尽?/p>

(2)slow_query_log_file 的值是記錄的慢查詢?nèi)罩镜轿募校?strong>注意:默認(rèn)名為主機(jī)名.log,慢查詢?nèi)罩臼欠駥懭胫付ㄎ募校枰付樵兊妮敵鋈罩靖袷綖槲募,相關(guān)命令為:show variables like ‘%log_output%’;去查看輸出的格式)。

(3)long_query_time 指定了慢查詢的閾值,即如果執(zhí)行語句的時(shí)間超過該閾值則為慢查詢語句,默認(rèn)值為10秒。

(4)log_queries_not_using_indexes 如果值設(shè)置為ON,則會(huì)記錄所有沒有利用索引的查詢(注意:如果只是將log_queries_not_using_indexes設(shè)置為ON,而將slow_query_log設(shè)置為OFF,此時(shí)該設(shè)置也不會(huì)生效,即該設(shè)置生效的前提是slow_query_log的值設(shè)置為ON),一般在性能調(diào)優(yōu)的時(shí)候會(huì)暫時(shí)開啟,開啟后使用full index scan的sql也會(huì)被記錄到慢查詢?nèi)罩尽?/p>

//上述命令只對(duì)當(dāng)前生效,當(dāng)MySQL重啟失效,如果要永久生效,需要配置my.cnf

查看輸出格式:文件?表show variables like ‘%log_output%’;

開啟通用日志查詢: set global general_log=on;

關(guān)閉通用日志查詢: set globalgeneral_log=off;

設(shè)置通用日志輸出為表方式: set globallog_output=’TABLE’;

設(shè)置通用日志輸出為文件方式: set globallog_output=’FILE’;

設(shè)置通用日志輸出為表和文件方式:set global log_output=’FILE,TABLE’;

查詢慢查詢語句的個(gè)數(shù):show global status like ‘%slow%’;

日志部分內(nèi)容簡(jiǎn)介:

哪條語句導(dǎo)致慢查詢(sql_text),該慢查詢語句的查詢時(shí)間(query_time),鎖表時(shí)間(Lock_time),以及掃描過的行數(shù)(rows_examined)等信息。

利用自帶的慢查詢?nèi)罩痉治龉ぞ撸簃ysqldumpslow

perl mysqldumpslow –s c –t 10 slow-query.log

-s 表示按何種方式排序,c、t、l、r分別是按照記錄次數(shù)、時(shí)間、查詢時(shí)間、返回的記錄數(shù)來排序,ac、at、al、ar,表示相應(yīng)的倒敘;-t 表示top的意思,后面跟著的數(shù)據(jù)表示返回前面多少條;-g 后面可以寫正則表達(dá)式匹配,大小寫不敏感。

使用Performance Schema:【源】【源】

監(jiān)視MySQL服務(wù)器,收集性能參數(shù),且表的存儲(chǔ)引擎PERFORMANCE_SCHEMA,低耗能

本地服務(wù)器,表是內(nèi)存表,表內(nèi)容在服務(wù)器啟動(dòng)時(shí)重新填充,關(guān)閉時(shí)丟棄,更改不會(huì)被復(fù)制或?qū)懭攵M(jìn)制日志

特性:

性能方案配置可被動(dòng)態(tài)的執(zhí)行SQL修改,立即影響到數(shù)據(jù)收集

監(jiān)控服務(wù)事件:事件是服務(wù)做并被感知到的任何事,時(shí)間信息可被收集

數(shù)據(jù)庫性能方案,提供對(duì)運(yùn)行時(shí)數(shù)據(jù)庫服務(wù)進(jìn)行內(nèi)部檢查的方式,關(guān)注性能數(shù)據(jù)

特定于一個(gè)數(shù)據(jù)庫服務(wù),數(shù)據(jù)庫表關(guān)聯(lián)到數(shù)據(jù)服務(wù),修改不會(huì)被備份也不寫進(jìn)二進(jìn)制日志

存儲(chǔ)引擎用“感知點(diǎn)”收集事件數(shù)據(jù),且存儲(chǔ)在performance_schema數(shù)據(jù)庫,可通過select語句進(jìn)行查詢

補(bǔ)充:數(shù)據(jù)庫初始安裝有三個(gè)基本庫

mysql

包含權(quán)限配置,事件,存儲(chǔ)引擎狀態(tài),主從信息,日志,時(shí)區(qū)信息,用戶權(quán)限配置等

information_schema

對(duì)數(shù)據(jù)庫元數(shù)據(jù)的抽象分析,由此提供了SQL語句方式來查詢數(shù)據(jù)庫運(yùn)行時(shí)狀態(tài),每次對(duì)information_schema的查詢都產(chǎn)生對(duì)metadata的互斥訪問,影響其他數(shù)據(jù)庫的訪問性能。

performance_schema

內(nèi)存型數(shù)據(jù)庫,使用performance_schema 存儲(chǔ)引擎,通過事件機(jī)制將mysql服務(wù)的運(yùn)行時(shí)狀態(tài)采集并存儲(chǔ)在performace_schema數(shù)據(jù)庫。注意,兩個(gè)單詞之間用下劃線連接時(shí),表示performance_schema是一個(gè)數(shù)據(jù)庫;用空格分開時(shí),表示一個(gè)數(shù)據(jù)庫性能方案,也表示一個(gè)存儲(chǔ)引擎。

相關(guān)文章:

【MySQL數(shù)據(jù)庫】第三章解讀:服務(wù)器性能剖析 (下)

【MySQL數(shù)據(jù)庫】第二章解讀:MySQL基準(zhǔn)測(cè)試

以上就是【MySQL數(shù)據(jù)庫】第三章解讀:服務(wù)器性能剖析(上)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。