一個系統(tǒng)中數(shù)據(jù)庫往往會成為性能瓶頸,在開發(fā)階段更多考慮的可能是功能的完成,隨著系統(tǒng)的投入使用,數(shù)據(jù)量越來越大,sql語句查詢速度慢的問題就會被凸顯出來。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供駐馬店網(wǎng)站建設(shè)、駐馬店做網(wǎng)站、駐馬店網(wǎng)站設(shè)計、駐馬店網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、駐馬店企業(yè)網(wǎng)站模板建站服務(wù),十年駐馬店做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
對于一個有sql語句性能為題的系統(tǒng),如何找出問題,解決問題,就是下面要探討的內(nèi)容:
1.????查看sql執(zhí)行頻率:
MySQL客戶端連接成功以后,通過show [session|global] status命令可以提供服務(wù)器狀態(tài)信息,show session status顯示當前連接的統(tǒng)計結(jié)果,show global status顯示自數(shù)據(jù)庫上次啟動至今的統(tǒng)計結(jié)果,如果不寫默認參數(shù)是session.
我們關(guān)心的信息可以通過下面這個語句獲取到
Show status like ‘com_______’;(com后面是六個下劃線作為占位符)
它可以查詢出com開頭的信息。這查詢的是當前連接的統(tǒng)計結(jié)果,如果想查全局可以使用:
Show global status like ‘com______’;
? ?
Com_**指的是相應(yīng)語句執(zhí)行的次數(shù),它會對所有存儲引擎的表操作進行統(tǒng)計,有幾個數(shù)據(jù)比較重要:
Com_select執(zhí)行查詢的次數(shù),每次查詢累加1
Com_insert執(zhí)行插入操作的次數(shù),沒插入一條數(shù)據(jù)累加1,批量插入也累加1
Com_update執(zhí)行更新操作的次數(shù)
Com_delete執(zhí)行刪除操作的次數(shù)
?
show status like ‘Innodb_rows_%’;
這個命令可以顯示針對Innodb存儲引擎的信息
?
?
?
Innodb_rows_read:select查詢返回的行數(shù),
Innodb_rows_inserted插入的條數(shù)
Innodb_rows_updated更新的條數(shù)
Innodb_rows_deleted刪除的條數(shù)
Connections:試圖連接MySql服務(wù)器的次數(shù)
Uptime:服務(wù)器工作時間
Show_queries:慢查詢的次數(shù)
?
通過這兩個命令我們可以看到當前系統(tǒng)是查詢占主要地位還是插入占主要地位,為我們的后續(xù)優(yōu)化提供一個方向
?
?
2.???定位低效率的sql:
可以通過兩種方法來定位低效率的sql
1)???慢查詢?nèi)罩?,可以通過慢查詢?nèi)罩緛矶ㄎ坏侥切﹫?zhí)行速度慢的sql語句,但是慢查詢?nèi)罩臼窃诓樵兘Y(jié)束之后再記錄,并不能實時反映sql語句執(zhí)行的狀態(tài)。
2)???show processlist:通過這個命令可以實時的看到當前mysql在執(zhí)行的線程,包括線程的執(zhí)行狀態(tài),可以看到sql語句執(zhí)行的狀態(tài)
?
Id:用戶登錄時系統(tǒng)分配的連接id
User:顯示當前登錄用戶,這個命令只顯示當前登錄用戶權(quán)限范圍內(nèi)的sql語句
Host:?顯示這個sql語句是由哪個ip的哪個端口發(fā)出的。
Db:顯示這個進程連接的是哪個數(shù)據(jù)庫
Command:顯示當前連接執(zhí)行的是什么命令,一般有休眠(Sleep),查詢(Query),連接(Connection)等
Time:顯示這個狀態(tài)持續(xù)的時間,單位是秒
State:顯示當前sql語句執(zhí)行狀態(tài),比如查詢語句可能經(jīng)過如下狀態(tài):copying to tmp table、sorting result、sending data
Info:顯示這個sql語句,通過它可以判斷問題