背景:服務器cpu報警,5分鍾內3次超過30%。當時,公司管理產品的同事正通過我們提供的程序對上傳的數據做處理。
原本一分鍾能處理10000條數據的,突然變成一分鍾只能處理100左右。對每個數據操作時間進行排查發現,更新操作的時間是0.6s,從這個時間推算,差不多一分鍾就只能處理100條左右。
但是之前為什么能處理那么多呢?原來今天剛運行的數據是修改數據的操作。然后發現修改所依據的字段不是主鍵,也沒有加索引。馬上對它建立索引,再次運行,發現增加到1000條,並沒有到10000條級別。折騰了很久,發現是剛發現cpu過高時,給代碼設置的usleep時間是0.1s,每跑完一條休息0.1s,自然是只能差不多1000條了。最后把這個去掉之后就又正常了。
更新時where語句中的條件字段一定要加索引,尤其是大批量的數據更新。本例中,沒有將主鍵作為條件字段,這也是一個原因。