Mysql
如何配置 MySQL Innodb 以每小時處理 1000 次插入?
我有一個流量很高的網站,每小時可能會插入 1000 條新記錄。
這一錯誤使網站陷入癱瘓:
PDOException: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction: INSERT INTO {location_instance} (nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4); Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )
如果 MySQL 不能處理這種類型的負載,我會感到非常驚訝。那麼,我的問題是,這是一個數據庫問題嗎?如何配置 MySQL 來處理這麼多的流量?
我在開發伺服器上設置了我的網站副本,其中包含模擬添加到網站的內容負載的腳本。我正在執行具有 16GB RAM 的 Ubuntu、LAMP 堆棧。
誠然,我對數據庫不是很了解。事實上,我是從“apt-get install”完成後附帶的預設 my.cnf 開始的。表都是 Innodb。你會推薦什麼起始配置設置和方法來開始解決這個問題?
讓我知道您可能需要更多資訊。
謝謝
您正在處理死鎖,而不是性能瓶頸問題。
如果您每小時有 1000 條新記錄,那麼您離達到 MySQL 的限制還很遠。MySQL 可以處理至少 50 倍的負載。
死鎖是由應用程式碼引起的,不是數據庫伺服器的錯。死鎖不能在 MySQL 伺服器端修復,除非在某些特定情況下。
InnoDB
可以通過SHOW ENGINE INNODB STATUS
在 MySQL 提示符下執行或使用mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS"
.但是,這只顯示最後發生的死鎖,沒有死鎖日誌。
值得慶幸的是,有一個工具pt-deadlock-logger可以解決該問題,它負責輪詢
InnoDB
狀態並在使用新死鎖刷新之前保存所有詳細的死鎖資訊。