我在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个索引。
答案 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