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

标签 mysql sql

我通过两个查询在 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/

相关文章:

php - 获取日期符合特定模式的行。 MySQL

mysql 如何创建按字母顺序排列的数字 A1、A2、A3 等

PHP PDO foreach 循环提供额外的表输出

sql - 联接表 SQL Server

mysql - 在 MySQL 中创建触发器来记录数据库中的更改

java - 如何使用java正则表达式将查询列表sql转换为查询计数sql

javascript - 使用 Node.js 将 MySQL 数据打印到 HTML 页面

mysql - Waterline ORM 在 MySQL 上插入空白单元

c# - Azure 数据库水平分片是 Multi-Tenancy C# asp.net 应用程序的最佳解决方案

mysql - 当存在自动递增的主键时,在 MySql 中插入忽略