选择行并在同一查询中更新它们?

时间:2015-03-20 03:26:50

标签: mysql sql

我在PHP&amp ;;中实现了一个作业队列MySQL(使用并行运行的多个脚本)通过两个查询:第一个用表更新ID值更新表中的行,然后第二个用该值检索行。这两个查询在事务内部执行,以防止并行运行的其他脚本检索相同的行。

第一个查询如下所示:

UPDATE products p
SET p.update_id = '550b8d7f3ba477.82670719', p.date_update_started = UTC_TIMESTAMP()
WHERE p.id IN
(
    SELECT p2.id
    FROM
    (
        SELECT p3.id
        FROM products p3
        WHERE p3.date_update_started < UTC_TIMESTAMP() - INTERVAL 1 HOUR # only allow the product processed if not selected for processing recently
                    AND p3.updated = 1
        ORDER BY p3.some_date ASC
    ) p2
)
LIMIT 100

然后第二个查询将只检索具有更新ID的行。

上述查询需要0.4秒才能在具有100k行的表上执行。性能让我担心,因为随着时间的推移,该表将增长到数万或数亿行。

可以以某种方式更改此查询以提高效率吗?

编辑:存储引擎是InnoDB,表上有22个索引。

1 个答案:

答案 0 :(得分:2)

这不会起作用吗?

UPDATE products
SET update_id = '550b8d7f3ba477.82670719', 
    date_update_started = UTC_TIMESTAMP()
WHERE date_update_started < UTC_TIMESTAMP() - INTERVAL 1 HOUR 
    AND updated = 1
ORDER BY some_date
LIMIT 100