我有一个相当大的表,有150个单独的PHP脚本连接,选择要处理的数据,更新为in_use
,然后处理。
因此,在同一会话中没有脚本选择与另一个相同的数据,in_use
已设置,并且事务锁用于确保没有脚本选择与另一个相同的数据。这是代码(在PHP中):
$sql - "select data....FOR UPDATE;" // <-- real query is much longer and not really neccesary here.
mysqli_autocommit($db_connect, FALSE);
mysqli_begin_transaction($db_connect, MYSQLI_TRANS_START_READ_WRITE);
$b = mysqli_query($db_connect, $sql);
$to_process = mysqli_fetch_all($b, MYSQLI_ASSOC);
$s = "'" . implode("', '", $to_process) . "'";
mysqli_query($db_connect, "UPDATE `users` SET `in_use` = 1 WHERE `username` IN ({$s});");
mysqli_commit($db_connect);
问题在于,每次选择(手动完成需要几秒钟),在150个查询中的每个查询之间需要10分钟(这意味着总共只需要1500分钟选择数据)。是否有MySQL
使用的频率变量来查看何时检查锁是否空闲?我真的需要加快速度,因为每个SELECT
查询之间只需要几秒钟。
全部谢谢!
修改
查询是:
SELECT DISTINCT `username`
FROM `users`
WHERE `in_use` = 0
AND `username_from` IN
( SELECT DISTINCT `username`
FROM `source_accounts`
WHERE `group_users` = '{$owner['group_users']}'
AND (`type` = 'users' OR `type` = 'both')
AND `use` = '1'
)
AND `username` NOT IN
( SELECT `user_request`
FROM `request_history`
WHERE `owner_account` = '{$owner['username']}'
)
LIMIT {$owner['follow']} FOR UPDATE;