mysql - SQL UPDATE 的改进

标签 mysql sql

我需要改进此 SQL UPDATE 查询。该查询必须只更新第一行,但我怀疑它在运行所有行和运行所有行的子查询时使用了大量的能量,因为当使用大型数据库时它非常慢。有什么建议吗?

    UPDATE leads l
    SET status='processing', processor='$processor' 
    WHERE pool IN ($pools) AND status='active'
    ORDER BY (SELECT count(*) FROM calls c WHERE c.lead = l.id), id ASC
    LIMIT 1

更新

缓慢确实是由子选择引起的。通常,领先表中可能有 2000-3000 场比赛。最简单的方法是在线索表中建立一个列,手动计算调用次数,这样我就不需要子选择,但它是一个正在运行的站点,需要在其中进行这些更改,所以如果我现在添加了该列。

但我认为这是避免大型子选择的唯一方法。

最佳答案

对我来说 - 缓慢来自子选择。对于每个,您查询所有调用以计算它们的数量。首先确保 calls.lead 已编入索引。您可以将该计数器保留在中,并使用触发器来保持其真实性。另一种选择是将该信息保留在索引内,但我不知道如何在 MySQL 上使用它,特别是在未知版本上

关于mysql - SQL UPDATE 的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37520374/

相关文章:

java - JPA + MySql + 实现加密密码

php - 从 MySQL 中提取数据用于 Feed

mysql - SQL 查询使用外连接并限制每个父项的子记录

mysql - 有没有办法在使用 SQL 从表中提取列时更改列中的现有数据

mysql - 为什么这个简单的 SQL 查询会在一个简单的 6k 记录表上造成严重滞后?

sql - 并行查询工作线程陷入死锁

mysql语句(SELECT)基于现在的日期

php - 在mysql查询中获取匹配的列值

mysql - 如何使用主题标签(我喜欢#running)作为帖子中的链接?

sql - 对 CASE WHEN SQL 的结果执行多值 LIKE