我正在处理一个复杂的脚本,可以处理多达500,000条记录。这是我的问题。
基本上我的代码将解析一个文本文件以获取每个500,000左右的记录。每条记录都有一个类别,我的代码需要检查在该特定处理过程中是否为该类别创建了categories
表中的新记录,如果没有,它将创建该记录。
所以我有两个选择:
1)我存储了一组包含类别名称和ID的keys =>值,所以我可以这样做:
if (array_key_exists($category,$allCategories))
$id=$allCategories[$category];
else
{
mysql_query("INSERT INTO categories (procId,category)
VALUES ('$procId''$category')");
$id=mysql_insert_id();
$allCategories[$category]=$id;
}
2)每次处理此文本文件时,它都会获得自己的进程ID。因此,我可以这样做,而不是检查可能增长到100,000个以上的$allCategories
变量:
SELECT id FROM categories WHERE procId='$procId' AND category='$category'
这里的缺点是将为500,000多条记录中的每条记录运行此查询。而在数组中保存所有类别的缺点是我的内存不足或服务器可能崩溃。
有什么想法吗?
答案 0 :(得分:2)
您能保留一份已插入的ID列表吗?如果它们是整数id,则每次为4个字节,100,000个条目仅使用大约400K的内存。
ETA:
为避免存储类别名称,请对名称进行哈希并存储哈希值。使用128位MD5哈希,即每个哈希16个字节或仅大约1.6MB内存+开销。
答案 1 :(得分:1)
一个想法是在表上添加约束,以便数据库拒绝重复的插入。 然后继续插入所有记录并让db进行检查。
答案 2 :(得分:1)
鉴于你的平均类别名称是30个字节,你只需要30 * 500000字节= 15000000字节= 15000千字节= 1.5兆字节。
我认为你有这么多记忆。