我有两个表,名为actual和check
表actual包含5000万行,每一行包含32位散列。
表check包含1000万行,每一行包含32位散列。
我必须验证check表中的散列是否在actual表中。
我尝试了MySQL连接查询,如
SELECT *
FROM `check`
LEFT
JOIN `actual`
on `check`.hash = `actual`.hash;即使在16 is的内存机器上,MySQL也在崩溃。
我尝试使用PHP将额外的字段添加到表check中,作为字段名散列、状态查找。
Status & found默认为0,PHP将检查每条记录并将状态更新为1,如果找到,则会将状态更新为1。
有没有办法更快地检查数百万或记录?
另一种方法是插入,使用忽略作为唯一的散列,并检查有多少没有附加,而是其复杂的过程。
--我正在使用的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);
}
}
}发布于 2021-03-03 09:48:39
如果我对你的理解是对的,你只需要一个子查询:
UPDATE check SET status=1, found=1 WHERE hash IN (SELECT hash FROM actual)我没有足够的数据来做一个有意义的性能比较--试试看。
编辑:通过查看解决方案可以更清楚地了解需求,下面是一个更新的查询:
UPDATE `check` SET status=1, found=(hash IN (SELECT hash FROM actual)) WHERE status=0 注意:
actual.hash被索引是很重要的,或者搜索actual表需要花费一定的时间。根据check中选中的行和未检查的行之间的平衡,check.status。如果大多数行未经检查,就不会有任何好处,但如果只有少数未检查的行,则可以很好地工作。写入索引表可能要慢得多。您需要对数据集进行实验才能找到答案。发布于 2021-03-04 00:38:55
使用多表更新而不是IN ( SELECT ... )。
也是
SHOW CREATE TABLE。我们需要查看引擎、索引、数据类型、etc.SHOW VARIABLES LIKE 'innodb_buffer_pool_size';你说“崩溃”是什么意思?重新启动?我死了?还是简单地说查询花了很长时间?
一旦我们优化了查询,如果它仍然太慢,我将向您展示如何分阶段完成它。这可能需要直接编写SQL,而不是通过Django。
https://stackoverflow.com/questions/66454183
复制相似问题