Mysql佔用CPU過高如何優化?


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 的支持如何?

TAG:資料庫 | MySQL | CPU佔用率 | SQL優化 |