Mysql - 查詢很慢如何定位排查(接口訪問耗時太長)


1)數據庫本身

(1)查看數據庫狀態

(2)查找日志文件中是否有sql相關打印

(3)查看當前連接數

 執行 show processlist 查看mysql正在運行的sql線程

(4)查看mysql慢查詢日志(默認情況下,mysql不開啟慢查詢日志)
   可通過命令:show variables like '%slow_query_log%';

 查看mysql是否開啟了慢查詢,以及慢查詢日志在哪?

   ON表示已開啟,時間閾值是10s。
(5) 通過解釋函數explain分析sql語句 (可以檢查是否匹配到索引)

 explain select id from wow_movie_info

 只需要注意一個最重要的type信息,很明顯體現出是否用到索引,type結果值從好到壞依次是:

 system > const > eq_ref > ref > range > index > ALL

   一般來說,得保證查詢至少達到range級別,最好能達到ref,否則就可能會出現性能問題。

  (6)  優化 sql 邏輯或者盡量讓 sql 走對的索引,例如:

  1)、用in代替 or
  2)、聯合所用比單一索引更好,比如:時間一般為第一個參數,vgn_reported_data 聯合索引(t,type,ch)
  3)、myism引擎查詢更快

(7)子查詢過多,一般不建議使用子查詢,可以把子查詢改成join來優化

(8)深度分頁問題

  MySQL會把前120條數據都查出來,拋棄前100條,返回20條

select name,code from student limit 100,20

  隨着分頁深度的增大,可能會變成 1000000,20。如此大的數據量,速度一定快不起來,最好的方式是增加一個條件:

select name,code from student where id > 1000000 limit 20

  主鍵索引會直接鏈接到1000000處,然后查出20條,這個方式需要把上次查詢出來的最大id以參數的方式傳過來

(9)單純的數據量過大,分表或分庫+分表

2)業務邏輯層面(考慮是否需要開啟協程

1)循環調用:這種情況一般都循環調用同一段代碼,每次循環的邏輯一致,前后不關聯,可以使用多協程的方式

2)順序調用:一次性的順序調用,而且調用之間沒有結果上的依賴,可以使用多協程的方式

3)網絡環境因素


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM