mysql - MySQL DISTINCT 命令是否通过在内存中存储不同的键来工作?

标签 mysql database

我尝试查看 MySQL source code ,但发现很难找到 DISTINCT 函数所在的位置。

问题:
我有一个包含 5700 万行的数据库,它还可以变得更大。它有很多重复的行,我想对这些重复行中的列的值进行求和,以得到一个包含求和值但没有重复行的表。

我尝试使用唯一约束插入到新表中,但查询运行了几个小时并且没有完成。所以我们停止了它,一位同事尝试使用 group by,结果导致 MySQL 崩溃。

我们想要尝试的解决方案:
因此,我们考虑创建一个没有索引的表,并向其中插入所有不同行的虚拟行,然后使用 upsert 更新所有这些行,从而获得值的总和。为此,我们需要知道 DISTINCT 实际上是如何工作的。如果它将所有不同的键保留在内存中,那么我们可能会再次遇到 MySQL 崩溃。

共有 3 列,这 3 列的组合使一行变得不同。如果我们使用像INSERT INTO B SELECT DISTINCT * FROM A这样的东西,MySQL将如何确保唯一性?它是否将 HashMap 保留在列值的内存中,或者每次从表 A 中插入一行时是否检查整个表 B 是否有重复值?

编辑:
表架构:
id、cellID、attributeID、entityID、value、comboString
这里,id是主键,cellIDattributeIDentityID的组合是唯一的。所以问题是我有这样的行:
1、45632、4.5、“4.5.6”
2、45632、75.3、“4.5.6”
3、672、4、6、78.3、“6.7.2”
4, 453, 4, 3, 3.6, "4.5.3"

我需要合并表为:

1、45632、79.8、“4.5.6”
2、672、4、6、78.3、“6.7.2”
3, 453, 4, 3, 3.6, "4.5.3"

添加了值 4.5 和 75.3,因为第 1 行和第 2 行中的 456、3 和 2 相同。

最佳答案

如果您正在寻找一个实际的新表(正如您所暗示的那样),那么放弃纯 SQL 中的“干净”选项,而只用您最喜欢的语言编写脚本可能会更容易。

伪代码:

line = read_line_from_databas()
if( not exists_in_new_table){
    create_row_in_new_table(line)
}else{
    add_values_to_existing_line_in_new_table(line)
}

我认为这不会使您的数据库崩溃,因为它们都是非常简单的一次性查询。您只需运行脚本足够长的时间即可完成。

关于mysql - MySQL DISTINCT 命令是否通过在内存中存储不同的键来工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41952020/

相关文章:

mysql - 使用 MySQL View 检索运行总计

php - 日期不工作的 PDO bindParam

php - 如何在从数据库回显的同一个while循环中选择多个单选按钮

php - 归档一些具有继承性的实体

mysql - 即使值为空也显示结果

php - 数据库设计;或使用 json 数据进行条件选择

database - 更新 Clickhouse 中的数据

PHP 未从我的服务器文件夹中获取图像

javascript - 如何使用 PHP 从动态输入字段捕获数组值?

mysql - 数据库允许来自 Rails Fixtures 的错误外键