Mysql佔用CPU過高如何優化?
01-13
MySQL處在高負載環境下,磁碟IO讀寫過多,肯定會佔用很多資源,必然CP會U佔用過高。佔用CPU過高,可以做如下考慮:
1.打開慢查詢日誌,查詢是否是某個SQL語句佔用過多資源,如果是的話,可以對SQL語句進行優化,比如優化 insert 語句、優化 group by 語句、優化 order by 語句、優化 join 語句等等;
2.考慮索引問題;3.定期分析表,使用optimize table;4.優化資料庫對象;5.考慮是否是鎖問題;
6.調整一些MySQL Server參數,比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;7.如果數據量過大,可以考慮使用MySQL集群或者搭建高可用環境。CPU佔用過高和磁碟I/O沒有必然聯繫。如果資料庫I/O繁忙CPU反而利用率上不去,因為CPU處於I/O wait狀態。資料庫CPU高主要有2個原因,第一個是內存latch,第二個是硬解析。所以我覺得LZ應該從這兩方面去排查問題,優化I/O是錯誤的方向。
一般來講,排除高並發的因素,還是要找到你導致你CPU過高的哪幾條在執行的SQL,可以查slowlog,也可以使用innotop等工具實時監控,將那些執行時間過長且佔用資源過多的SQL拿來進行EXPLAIN分析,查看是否索引添加正常,還是SQL效率不行,導致CPU過高,多數是Group By、Order By排序問題所導致,然後慢慢進行優化改進。
你是不是沒用索引 全表排序 或者 全表 groupby了?亦或是 你對日期做了什麼操作?
可以考慮定時優化文件及索引,就mysql官方建議,一周或一月左右優化一次,mysql工具之mysqlcheckmysql資料庫文件優化
show processlist 或者mysql low query log, 定期監測即可
我不是dba,只能從使用上說一些方法給你參考。1. 盡量少用或者不用join語句,盡量讓所有的sql都使用索引(使用explain檢查);2. 如果是讀寫量過大的話,考慮在mysql上層搭建緩存(文件緩存或mc);
3. 根據自己的實際狀況使用mysql引擎,調優參數。
我反而不同意樓上的觀點,cpu高和IO還是有關係的比如:我們用ssd之後,mysql的qps明顯提升
mysql cpu高 99%的可能是sql不合理或者沒有合適索引導致 rows_read過高
當然也可能是qps非常高,熱點數據讀寫導致鎖爭用等
一般情況都是sql問題,建議優化sql推薦閱讀:
※為什麼 PostgreSQL 沒有 MySQL 流行呢?
※mysql如何實現四大隔離級別的?
※MySQL中inner join 和 cross join 的區別?
※mysql如何解決評論遞歸查詢?
※MySQL 和 PostgreSQL 相比,對 JSON 的支持如何?