Bir db tablo 29000 + satırları karşı 2700 + dosya adlarını Karşılaştırılması

3 Cevap php

I have a ftp repository that is currently at 2761 files (PDF files). I have a MySQL table (a list of those files) that's actually at 29k+ files (it hasn't been parsed since a recent upgrade). I'd like to provide admins with a one-click script that will do the following:

  • 1) veritabanı tablosundaki satırlar ile "varolan" dosya karşılaştır
  • 2) mevcut dosya sistemi olmayan herhangi satırları sil
  • 3) veritabanı tablosunda görünmüyor, bir dosya için yeni bir satır ekleyin

Bu genellikle bir AppleScript / FolderAction / Perl komut yöntemiyle ele, ancak (çok dosya bir anda eklendiğinde bazen şoklar - Ağır haber geceleri gibi) mükemmel değil edilir.

Bu kullanarak FTP depo ($file_list = ftp_nlist($conn_id,$target_dir) ) gelen dosya listesini oluşturmak için yaklaşık 10-20 saniye sürer, ve ben en iyi DB tablo ile karşılaştırarak hakkında gitmek nasıl emin değilim (ben pozitif olduğumu bir { [(1)]}) çalıştırmak için bir kabus sorgu olacaktır.

Herhangi bir öneriniz?

3 Cevap

Başka bir tabloya dosya adları listesini yükleyin, sonra gereklerini yerine sorgularının birkaç gerçekleştirin.

Yup that is the solution. I propose you to use pdo prepared insert statement to reduce time. or do what mysqldump does, generate insert into table(column1,column2, ... ) values(), (), (), ... ; insert into ...

Eğer mysql sitede maximun değerler listesini kontrol etmesi gerekir.

Ben genellikle geçici bir tabloya tarih ve dosya boyutları ile özyinelemeli dizin listesini dökümü. Sonra bulunamadı öğeleri çıkartın:

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

Sonra (dosya boyutları, CRClerin için) zaten var öğeleri güncelleştirmek:

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

Sonra buldum öğeler eklemek:

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 )

Bu bellek, yani sinek önce bunu test edin. Hiçbir şey seçeneğini boş şeyleri kontrol ederken RAM israf sizi tutar.