我有一个像这样的大表(1b 条记录):char(3),char(3),date,[6 more ints]。
我在程序 mysql 中寻找一个非常简单的功能但找不到它:删除当前光标位置的行。
我需要做的是:
- 按 (char, char, date) 索引对表进行排序
- 将当前行设置为第一行
- 将排名设置为 0
- 如果 rank > max_rank,则删除当前行。
- 转到下一行;排名加 1
- 如果索引中的 3 个值中的任何一个已更改,则可能将排名重置为 0
- 去 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程序):
想法一:
- 遍历表并创建需要删除的行的键数组
- 将数组拆分为例如 1000000 个较小的数组
- 对于每个小数组,创建并执行删除带有这些键的行的 DELETE 语句
想法二:
- 循环遍历表并将不应删除的行一一插入到另一个新表中。
- 删除旧表并重命名新表
想法三:
- 循环遍历表并将不应删除的行插入另一个新表。分批插入,例如 10000 行。
- 删除旧表并重命名新表
哪个想法最好?
现在我为此使用PHP!如果我算对了,在这个过程中使用了 3 COPIES OF MY DATA: 1 是我一直存储在硬盘上的数据(我想直接处理它), SECOND 是mysql_query()
PHP结果的缓冲区函数调用[可能也在内存或硬盘上],第三个是实际的 PHP 数组,它最终使我能够循环和删除。