将2700多个文件名与db表中的29000多行进行比较

时间:2010-02-09 01:59:41

标签: php mysql ftp

我有一个ftp存储库,目前有2761个文件(PDF文件)。 我有一个MySQL表(这些文件的列表)实际上是29k +文件(自最近的升级以来它没有被解析)。 我想为管理员提供一键式脚本,该脚本将执行以下操作:

  • 1)将“现有”文件名与数据库表中的行进行比较
  • 2)删除不在现有文件系统中的所有行
  • 3)为未出现在数据库表中的文件添加新行

这通常由AppleScript / FolderAction / Perl脚本方法处理,但它并不完美(有时在一次添加大量文件时会窒息 - 就像在重大新闻之夜一样)。

从FTP存储库构建文件列表大约需要10-20秒(使用$file_list = ftp_nlist($conn_id,$target_dir) ),我不确定如何最好地与数据库表进行比较(我很肯定是WHERE NOT IN (big_fat_list)将成为一个噩梦般的查询。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

将文件名列表加载到另一个表中,然后执行几个满足您要求的查询。

答案 1 :(得分:0)

是的,这是解决方案。我建议你使用pdo prepared insert语句来减少时间。 或者做mysqldump做的事情,生成插入表(column1,column2,...)的值(), (), (), ... ; 插入......

你必须检查mysql站点中的最大值列表。

答案 2 :(得分:0)

我通常将带有日期和文件大小的递归目录列表转储到临时表中。然后我删除未找到的项目:

delete
from A
where not exists (
    select null as nothing
    from   temp b
    where  a.key = b.key )

然后我更新已存在的项目(对于文件大小,CRC):

update a set nonkeyfield1 = b.nonkeyfield1, nonkeyfield2 = b.nonkeyfield2
from   a join temp b on a.key = b.key

然后我添加了找到的项目:

insert into A ( field, list)
select field, list
from   temp b
where  not exists (
    select null as nothing
    from   A
    where  b.key = a.key )

这是来自记忆,所以在飞行前先测试一下。选择null as as会阻止你在检查时浪费RAM。