Сравнение 2700+ имен файлов с 29000+ строками в таблице БД - PullRequest
1 голос
/ 09 февраля 2010

У меня есть ftp-репозиторий, который в настоящее время находится в 2761 файле (PDF-файлы). У меня есть таблица MySQL (список этих файлов), которая на самом деле имеет размер 29 тыс. Файлов (она не анализировалась с момента последнего обновления). Я хотел бы предоставить администраторам скрипт в один клик, который будет делать следующее:

  • 1) Сравните "существующие" имена файлов со строками в таблице базы данных
  • 2) Удалить все строки, которых нет в существующей файловой системе
  • 3) Добавить новую строку для файла, которого нет в таблице базы данных

Обычно это обрабатывается методом сценария AppleScript / FolderAction / Perl, но он не идеален (иногда он задыхается при добавлении большого количества файлов за раз - как в тяжелые новостные вечера).

Создание списка файлов из репозитория FTP занимает около 10-20 секунд (с использованием $file_list = ftp_nlist($conn_id,$target_dir) ), и я не уверен, как лучше сравнить таблицу с БД (я уверен, что WHERE NOT IN (big_fat_list) это будет кошмарный запрос для запуска).

Есть предложения?

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

Загрузите список имен файлов в другую таблицу, затем выполните несколько запросов, которые удовлетворяют вашим требованиям.

0 голосов
/ 09 февраля 2010

Я обычно выкидываю рекурсивный список каталогов с датами и размерами файлов во временную таблицу. Затем я удаляю предметы, не найденные:

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, поскольку ничто не мешает вам тратить ОЗУ, пока вы что-то проверяете.

0 голосов
/ 09 февраля 2010

Да, это решение. Я предлагаю вам использовать подготовленное оператором pdo выражение для сокращения времени. или сделайте то, что делает mysqldump, сгенерируйте вставки в таблицу (column1, column2, ...) values ​​(), (), (), ... ; вставить в ...

Вы должны проверить список значений maximun на сайте mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...