php - Mysql性能更新in()

标签 php mysql optimization

我有一个 UPDATE WHERE id IN() 的性能问题。 伪代码是(归结):

  1. 从 PHP 开始交易:

    $pdoAdapter->beginTransaction();
    
  2. 查询 MySQL 以获取来自外部世界并存储在数据库中且应开具发票的价格元素

    SELECT id, price 
    FROM incoming_price_elements 
    WHERE <advanced where> 
    FOR UPDATE
    
  3. 获取新的发票 ID

    SELECT id 
    FROM invoice_id_counter 
    FOR UPDATE; 
    UPDATE invoice_id_counter SET id=id+1;
    
  4. 在 PHP 中创建包含大量求和和其他聚合的发票并存储结果

    INSERT INTO invoices (id, total_price)
    VALUES (<id from 3.>, <total price summed>);
    
  5. 更新所有 incoming_price_elements 以将它们标记为已开票

    UPDATE incoming_price_elements 
    SET invoice_id=<id from 3.> 
    WHERE id IN (<all ids selected in 2.>);
    
  6. 提交


我的问题是第 5 步非常慢(在秒范围内)并且它在第 3 步中阻塞了 id 计数器。 传输的id数大于10000个id且id为主键。

关于如何优化它有什么建议吗?我正在考虑创建一个临时表并将所有 ID 选择到其中,但我对临时表的经验为零。

最佳答案

您可以使用 INNER JOIN 代替 IN 子句

  UPDATE incoming_price_elements a
  INNER JOIN (
      SELECT id
      FROM incoming_price_elements 
      WHERE  <advanced where> 

  ) t ON t.id = a.id 
  SET invoice_id= <id from 3.>

这应该会提高这部分“交易”的表现

关于php - Mysql性能更新in(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54402165/

相关文章:

php - Mysql fetch - 带有 HTML 链接的结果指向表 ID

php - phalcon 更新前自动选择

java - Java 小程序加载失败时如何显示消息?

PHP:返回 Laravel 4 中更新行的 id

C++:pow() 优化有两个常量

python - 将奇怪的门控快速应用于 pandas 数据

php - mysql INSERT INTO 语法错误 - 新用户 :)

c# - ASP.net Identity UserManager 不验证密码

php - 检查 mysql 数据库 PHP 中的 N/A 值

python - 我怎样才能使这段代码运行得更快? (在大语料库中搜索大词)