我通过两个查询在 PHP 和 MySQL 中实现了一个作业队列(与并行运行的多个脚本一起使用):第一个查询使用更新 ID 值更新表中的行,然后第二个查询使用此查询来检索行值(value)。这两个查询在事务内部执行,以防止并行运行的其他脚本检索相同的行。
第一个查询如下所示:
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 的行。
在具有 100k 行的表上执行上述查询需要 0.4 秒。性能让我担心,因为随着时间的推移,表将增长到数千万或数亿行。
能否以某种方式更改此查询以使其更加高效?
编辑:存储引擎是InnoDB,表上有22个索引。
最佳答案
这会不会起到同样的作用?
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
关于mysql - 选择行并在同一查询中更新它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29158903/