php - MySQL Process List - 提高性能 - 锁定问题

标签 php mysql sql database innodb

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_sizeinnodb_log_file_sizeinnodb_io_capacity 的默认值。默认值未针对高性能进行调整。

  • 按照@Paulo H. 的建议,设置 innodb_flush_log_at_trx_commit=2 以减少 fsync。

关于php - MySQL Process List - 提高性能 - 锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364800/

相关文章:

php - 从 MySQL 创建 Excel 文件

mysql - 具有 3 个表的简短 SQL 挑战,最大/分组依据,连接和排序依据

java - 准备语句对 SQL 注入(inject)的影响

php - 如何在 mySQL/PHP 中根据时间区分试用用户和非试用用户

php - 从 Zend Radio 表单元素中删除一个选项

javascript - 如何在sequelize中获取多对多关系的中间表的数据

sql - 使用子查询优化聚合 postgres 查询

sql - sql中的朴素贝叶斯计算

javascript - Laravel 重定向不起作用

PHP mysql 计算两列之间