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)順序調用:一次性的順序調用,而且調用之間沒有結果上的依賴,可以使用多協程的方式