【发布时间】:2021-06-01 20:52:21
【问题描述】:
我有两个表名为 actual 和 check
表 actual 包含 5000 万行,每行包含 32 位哈希
表 check 包含 1000 万行,每行包含 32 位哈希
我必须验证check 表中的哈希值是否在actual 表中。
我尝试了类似的 MySQL Join 查询
SELECT *
FROM `check`
LEFT
JOIN `actual`
on `check`.hash = `actual`.hash;
即使在 16GB RAM 机器上 MySQL 也会崩溃。
我尝试使用 PHP 脚本,将附加字段添加到表 check 作为字段名称哈希、状态、找到。
Status & found 默认为 0,PHP 将检查每条记录并将状态更新为 1,如果找到则更新为 1。
有什么方法可以更快地检查数百万或记录吗?
另一种方法是我使用 IGNORE 插入唯一的哈希并检查有多少没有附加,但它的过程很复杂。
我使用的 PHP 代码很慢
$sql = "SELECT * FROM `check` where status = 0 LIMIT 0, 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$check = "SELECT * FROM `actual` where hash = '".$row["hash"]."'";
$checkx = $conn->query($check);
$checky = "UPDATE `check` SET `status` = 1, `found` = 0 WHERE hash = '".$row["hash"]."'";
$conn->query($checky);
if ($checkx->num_rows > 0) {
$checky = "UPDATE `check` SET `status` = 1, `found` = 1 WHERE hash = '".$row["hash"]."'";
$conn->query($checky);
}
}
}
【问题讨论】:
-
列有索引吗?
-
@Raptor - 是的。
-
我们可以看到两个表的 SHOW CREATE TABLE 语句,以及您查询的 EXPLAIN 吗?
-
如果你是在php中执行select来使用检索到的数据来更新记录,那就不用麻烦了,直接使用update语句即可。
-
@Shadow 你的意思是不要使用两个不同的语句进行选择然后更新?相反,您建议使用一种说法?