0

我有一个像这样的大表(1b 条记录):char(3),char(3),date,[6 more ints]。

我在程序 mysql 中寻找一个非常简单的功能但找不到它:删除当前光标位置的行。

我需要做的是:

  1. 按 (char, char, date) 索引对表进行排序
  2. 将当前行设置为第一行
  3. 将排名设置为 0
  4. 如果 rank > max_rank,则删除当前行。
  5. 转到下一行;排名加 1
  6. 如果索引中的 3 个值中的任何一个已更改,则可能将排名重置为 0
  7. 去 4

在伪 C# 中它是如此简单:

var b = new List<Row>(1000000000) { ... };
b.Sort():
var r = 0;
var prev_b = b[0];
for (var i = 0; i < b.Count; i++)
{
  if (r > mr) { b.RemoveAt(i); i--; }
  if (b[i].x != prev_b.x) r = 0; 
  else r++;
  prev_b = b;
}

如果在 mysql 中不可能如此有效地做到这一点,那么下一个最好的方法是什么?

我的想法(全部作为一个mysql程序):

想法一:

  1. 遍历表并创建需要删除的行的键数组
  2. 将数组拆分为例如 1000000 个较小的数组
  3. 对于每个小数组,创建并执行删除带有这些键的行的 DELETE 语句

想法二:

  1. 循环遍历表并将不应删除的行一一插入到另一个新表中。
  2. 删除旧表并重命名新表

想法三:

  1. 循环遍历表并将不应删除的行插入另一个新表。分批插入,例如 10000 行。
  2. 删除旧表并重命名新表

哪个想法最好?

现在我为此使用PHP!如果我算对了,在这个过程中使用了 3 COPIES OF MY DATA: 1 是我一直存储在硬盘上的数据(我想直接处理它), SECOND 是mysql_query()PHP结果的缓冲区函数调用[可能也在内存或硬盘上],第三个是实际的 PHP 数组,它最终使我能够循环和删除。

4

0 回答 0