在 SHOW PROCESSLIST
中 - 它显示大约 30 多行已被锁定几秒钟然后更新。
有没有办法加快更新速度?
例子:
+------+-----------------+-----------+----------------+---------+------+----------+-------------------------------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+------+-----------------+-----------+----------------+---------+------+----------+--------------------------------------------------------------------------------
| 265 | user | localhost | xxxxxxxxxxxxxx | Query | 15 | Updating | UPDATE data SET status = '1', error = 'Unknown error' WHERE f= 0xxxxx
| 269 | user | localhost | xxxxxxxxxxxxxx | Query | 17 | Updating | UPDATE data SET status = '1', error = 'Invalid ....' WHERE f= 0xxx
| 280 | user | localhost | xxxxxxxxxxxxxx | Query | 7 | Updating | UPDATE data SET status = 1 WHERE f = 0xxxx
| 300 | user | localhost | xxxxxxxxxxxxxx | Query | 1 | Updating | UPDATE data SET status = '1', error = 'Unknown ....' WHERE f= 0xx
| 314 | user | localhost | xxxxxxxxxxxxxx | Query | 13 | Updating | UPDATE data SET status = '1', error = 'Invalid....' WHERE f= 0xxxx
| 327 | user | localhost | xxxxxxxxxxxxxx | Query | 11 | Updating | UPDATE data SET status = '1', error = 'Unknown ....' WHERE f= 0xxxx
| 341 | user | localhost | xxxxxxxxxxxxxx | Sleep | 2 | | NULL
| 350 | user | localhost | xxxxxxxxxxxxxx | Query | 7 | Updating | UPDATE data SET status = '1', error = 'Unknown ....' WHERE f= 0xxx
| 360 | user | localhost | xxxxxxxxxxxxxx | Query | 5 | Updating | UPDATE data SET status = 1 WHERE f = 0xxxx
有很多UPDATE - 我正在使用InnoDB
,一些字段是index
。
在数据表中,有超过 500,000 行需要在 PHP CLI 脚本(在 Linux 中运行在后台/进程中)循环时更新。
最佳答案
确保
f
列已编入索引,以便 WHERE 子句使用它。否则,您将针对每个更新扫描整个表。尝试对更新进行分组,这样您就可以使用一个 UPDATE 设置多行,而不是一次设置一行。
确保您没有使用自动提交。尝试对每个事务执行多个更改。
确保您已调优 InnoDB。大多数人使用
innodb_buffer_pool_size
、innodb_log_file_size
和innodb_io_capacity
的默认值。默认值未针对高性能进行调整。按照@Paulo H. 的建议,设置
innodb_flush_log_at_trx_commit=2
以减少 fsync。
关于php - MySQL Process List - 提高性能 - 锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364800/