欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決MySQL Sending data導致查詢很慢問題的方法與思路

 更新時間:2016年04月20日 15:05:02   作者:yah99_wolf  
這篇文章主要介紹了解決MySQL Sending data導致查詢很慢問題的方法與思路,感興趣的小伙伴們可以參考一下

最近幫忙定位一個mysql查詢很慢的問題,定位過程綜合各種方法、理論、工具,很有代表性,分享給大家。

【問題現(xiàn)象】

使用sphinx支持倒排索引,但sphinx從mysql查詢源數(shù)據(jù)的時候,查詢的記錄數(shù)才幾萬條,但查詢的速度非常慢,大概要4~5分鐘左右

【處理過程】

1)explain

首先懷疑索引沒有建好,于是使用explain查看查詢計劃,結果如下:


從explain的結果來看,整個語句的索引設計是沒有問題的,除了第一個表因為業(yè)務需要進行整表掃描外,其它的表都是通過索引訪問

2)show processlist;

explain看不出問題,那到底慢在哪里呢?

于是想到了使用 show processlist查看sql語句執(zhí)行狀態(tài),查詢結果如下:


發(fā)現(xiàn)很長一段時間,查詢都處在 “Sending data”狀態(tài)

查詢一下“Sending data”狀態(tài)的含義,原來這個狀態(tài)的名稱很具有誤導性,所謂的“Sending data”并不是單純的發(fā)送數(shù)據(jù),而是包括“收集 + 發(fā)送 數(shù)據(jù)”。

這里的關鍵是為什么要收集數(shù)據(jù),原因在于:mysql使用“索引”完成查詢結束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“數(shù)據(jù)行”上將需要返回的數(shù)據(jù)讀取出來返回個客戶端。

3)show profile

為了進一步驗證查詢的時間分布,于是使用了show profile命令來查看詳細的時間分布

首先打開配置:set profiling=on;
執(zhí)行完查詢后,使用show profiles查看query id;
使用show profile for query query_id查看詳細信息;

結果如下:


從結果可以看出,Sending data的狀態(tài)執(zhí)行了216s

4)排查對比

經(jīng)過以上步驟,已經(jīng)確定查詢慢是因為大量的時間耗費在了Sending data狀態(tài)上,結合Sending data的定義,將目標聚焦在查詢語句的返回列上面

經(jīng)過一 一排查,最后定為到一個description的列上,這個列的設計為:`description`varchar(8000) DEFAULT NULL COMMENT '游戲描述',

于是采取了對比的方法,看看“不返回description的結果”如何。show profile的結果如下:


可以看出,不返回description的時候,查詢時間只需要15s,返回的時候,需要216s,兩者相差15倍

【原理研究】

至此問題已經(jīng)明確,但原理上我們還需要繼續(xù)探究。

這篇淘寶的文章很好的解釋了相關原理:innodb使用大字段text,blob的一些優(yōu)化建議

這里的關鍵信息是:當Innodb的存儲格式是 ROW_FORMAT=COMPACT (or ROW_FORMAT=REDUNDANT)的時候,Innodb只會存儲前768字節(jié)的長度,剩余的數(shù)據(jù)存放到“溢出頁”中。

我們使用show table status來查看表的相關信息:


可以看到,平均一行大約1.5K,也就說大約1/10行會使用“溢出存儲”,一旦采用了這種方式存儲,返回數(shù)據(jù)的時候本來是順序讀取的數(shù)據(jù),就變成了隨機讀取了,所以導致性能急劇下降。

另外,在測試過程中還發(fā)現(xiàn),無論這條語句執(zhí)行多少次,甚至將整個表select *幾次,語句的執(zhí)行速度都沒有明顯變化。這個表的數(shù)據(jù)和索引加起來才150M左右,而整個Innodb buffer pool有5G,緩存整張表綽綽有余,如果緩存了溢出頁,性能應該大幅提高才對。

但實測結果卻并沒有提高,因此從這個測試可以推論Innodb并沒有將溢出頁(overflow page)緩存到內(nèi)存里面。

這樣的設計也是符合邏輯的,因為overflow page本來就是存放大數(shù)據(jù)的,如果也放在緩存里面,就會出現(xiàn)一次大數(shù)據(jù)列(blob、text、varchar)查詢,可能就將所有的緩存都更新了,這樣會導致其它普通的查詢性能急劇下降。

【解決方法】

找到了問題的根本原因,解決方法也就不難了。有幾種方法:

1)查詢時去掉description的查詢,但這受限于業(yè)務的實現(xiàn),可能需要業(yè)務做較大調(diào)整

2)表結構優(yōu)化,將descripion拆分到另外的表,這個改動較大,需要已有業(yè)務配合修改,且如果業(yè)務還是要繼續(xù)查詢這個description的信息,則優(yōu)化后的性能也不會有很大提升。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助。

相關文章

  • mysql修改開啟允許遠程連接的方法

    mysql修改開啟允許遠程連接的方法

    這篇文章主要為大家詳細介紹了mysql修改開啟允許遠程連接的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Mysql using使用詳解

    Mysql using使用詳解

    本文主要介紹了Mysql using使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • windows下mysql 8.0.12安裝步驟及基本使用教程

    windows下mysql 8.0.12安裝步驟及基本使用教程

    這篇文章主要為大家詳細介紹了windows下mysql 8.0.12安裝步驟及基本使用教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 利用mysql事務特性實現(xiàn)并發(fā)安全的自增ID示例

    利用mysql事務特性實現(xiàn)并發(fā)安全的自增ID示例

    項目中經(jīng)常會用到自增id,比如uid,下面為大家介紹下利用mysql事務特性實現(xiàn)并發(fā)安全的自增ID,感興趣的朋友可以參考下
    2013-11-11
  • Mysql創(chuàng)建json字段索引的兩種方式

    Mysql創(chuàng)建json字段索引的兩種方式

    本文主要介紹了Mysql創(chuàng)建json字段索引的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 關于查詢MySQL字段注釋的5種方法總結

    關于查詢MySQL字段注釋的5種方法總結

    在MySQL數(shù)據(jù)庫中,字段或列的注釋是用屬性comment來添加,下面這篇文章主要給大家介紹了關于查詢MySQL字段注釋的5種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • mysql通過查看跟蹤日志跟蹤執(zhí)行的sql語句

    mysql通過查看跟蹤日志跟蹤執(zhí)行的sql語句

    在SQL SERVER下跟蹤sql采用事件探查器,而在mysql下如何跟蹤sql呢,下面有個不錯的方法,大家可以參考下
    2014-01-01
  • MySQL 查詢結果以百分比顯示簡單實現(xiàn)

    MySQL 查詢結果以百分比顯示簡單實現(xiàn)

    用到了MySQL字符串處理中的兩個函數(shù)concat()和left()實現(xiàn)查詢結果以百分比顯示,具體示例代碼如下,感興趣的朋友可以學習下
    2013-07-07
  • Mysql百萬級分頁優(yōu)化技巧

    Mysql百萬級分頁優(yōu)化技巧

    這篇文章主要介紹了Mysql百萬級分頁優(yōu)化技巧,包括普通分頁和優(yōu)化分頁兩種,在數(shù)據(jù)量比較大的時候,我們盡量去利用索引來優(yōu)化語句。下面通過本文給大家詳細講解,一起看看吧
    2016-12-12
  • MySQL8.0開啟遠程連接權限的方法步驟

    MySQL8.0開啟遠程連接權限的方法步驟

    MySQL8.0設置遠程訪問權限,找了一圈都沒找到一個適用的,索性自己寫一個,這篇文章主要給大家介紹了關于MySQL8.0開啟遠程連接權限的方法步驟,需要的朋友可以參考下
    2022-06-06

最新評論