首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL检查大量数据

MySQL检查大量数据
EN

Stack Overflow用户
提问于 2021-03-03 09:27:01
回答 2查看 166关注 0票数 0

我有两个表,名为actualcheck

actual包含5000万行,每一行包含32位散列。

check包含1000万行,每一行包含32位散列。

我必须验证check表中的散列是否在actual表中。

我尝试了MySQL连接查询,如

代码语言:javascript
运行
复制
SELECT * 
  FROM `check` 
  LEFT 
  JOIN `actual` 
    on `check`.hash = `actual`.hash;

即使在16 is的内存机器上,MySQL也在崩溃。

我尝试使用PHP将额外的字段添加到表check中,作为字段名散列、状态查找。

Status & found默认为0,PHP将检查每条记录并将状态更新为1,如果找到,则会将状态更新为1。

有没有办法更快地检查数百万或记录?

另一种方法是插入,使用忽略作为唯一的散列,并检查有多少没有附加,而是其复杂的过程。

--我正在使用的PHP代码--但是它的非常慢

代码语言:javascript
运行
复制
$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);
      }
    }
  }
EN

回答 2

Stack Overflow用户

发布于 2021-03-03 09:48:39

如果我对你的理解是对的,你只需要一个子查询:

代码语言:javascript
运行
复制
UPDATE check SET status=1, found=1 WHERE hash IN (SELECT hash FROM actual)

我没有足够的数据来做一个有意义的性能比较--试试看。

编辑:通过查看解决方案可以更清楚地了解需求,下面是一个更新的查询:

代码语言:javascript
运行
复制
UPDATE `check` SET status=1, found=(hash IN (SELECT hash FROM actual))  WHERE status=0 

注意:

  • -- actual.hash被索引是很重要的,或者搜索actual表需要花费一定的时间。根据check中选中的行和未检查的行之间的平衡,
  • 可能也值得索引check.status。如果大多数行未经检查,就不会有任何好处,但如果只有少数未检查的行,则可以很好地工作。写入索引表可能要慢得多。您需要对数据集进行实验才能找到答案。
票数 1
EN

Stack Overflow用户

发布于 2021-03-04 00:38:55

使用多表更新而不是IN ( SELECT ... )

也是

  • 什么版本的MySQL?
  • 请提供SHOW CREATE TABLE。我们需要查看引擎、索引、数据类型、etc.
  • SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

你说“崩溃”是什么意思?重新启动?我死了?还是简单地说查询花了很长时间?

一旦我们优化了查询,如果它仍然太慢,我将向您展示如何分阶段完成它。这可能需要直接编写SQL,而不是通过Django。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66454183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档