循环遍历表并删除程序mysql中的一些行

时间:2013-11-08 22:38:11

标签: php mysql sql arrays

我有一张巨大的桌子(1b记录),如下所示:   char(3),char(3),date,[6 more int]。

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

我需要做的是:

  1. 按(char,char,date)索引
  2. 对表进行排序
  3. 将当前行设置为第一行
  4. 将等级设为0
  5. 如果排名> max_rank,删除当前行。
  6. 转到下一行;将1加入等级
  7. 如果索引中的3个值中的任何一个发生了变化,可能会将等级重置为0
  8. 转到4
  9. 在伪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程序):

    想法I:

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

      1. 遍历表并将不应删除的行插入另一个新表中。
      2. 删除旧表并重命名新
      3. 创意III:

        1. 遍历表并插入不应删除的行到另一个新表中。分批插入例如10000行。
        2. 删除旧表并重命名新
        3. 哪种想法最好?

          现在我用PHP来做这个!如果我可以正确计算,在这个过程中使用3个我的数据副本:ONE是我的数据总是存储在硬盘上(我想直接处理它),THE SECOND是{的结果的缓冲区{1}} PHP函数调用[也许也在内存或硬盘上],而THIRD是实际的PHP数组,它最终使我能够遍历和删除。

0 个答案:

没有答案