Avatar billede axel21 Juniormester
21. april 2009 - 14:18 Der er 5 kommentarer og
1 løsning

MySQL/PHP problem (langsom søgning)

Hej Eksperter,

Jeg har lavet et script som krydstjekker en csv fil med en tabel jeg har i MySQL. Hvis den finder 2 som er "ens" smider den data ind i en anden database.

Lige nu tjekker scriptet alle rækker i csv filen igennem for hver cvr nummer fra min tabel. Men dette er en temmelig langsommelig process. Kan dette optimeres måske, så den sammenligner alle mine data fra tabellen med csv filen, så den kun skal igennem csv filen en gang, den er nemlig på over 500 mb.

Jeg har følgende script:



$import = mysql_query("SELECT cvr FROM virksomheder WHERE cvr > '0'");
while($row = mysql_fetch_array($import)){
        $handle = fopen("cvr1.csv", "r");
while ($data = fgetcsv($handle, 1000, ";")){
    if($data[1] == $row[cvr] AND $data[2] == '0'){
          $import1="INSERT into virksomhederfracvr(cvrnr,pnr,navn,navn1,adresse,bynavn,postnr,postdist,region,kommunenavn,antalansatte,virkform,virkstartdato,branchenr,branchetekst,telefon,telefax,email) values('$data[1]','$data[2]','$data[3]','$data[4]','$data[7]','$data[8]','$data[11]','$data[12]','$data[15]','$data[17]','$data[32]','$data[34]','$data[39]','$data[42]','$data[46]','$data[49]','$data[50]','$data[51]')";

mysql_query($import1) or die(mysql_error());
Avatar billede michael_stim Ekspert
21. april 2009 - 14:43 #1
En idé. Du tager alt data fra tabellen og lægger i et array. Så tager du csv-filen og splitter op i et array og sammenligner de to arrays. Ved ikke om det er hurtigere, da jeg ikke har noget at sammenligne med.
Avatar billede axel21 Juniormester
21. april 2009 - 14:55 #2
Lyder måske som en god idé. Grunden er at csv filen indeholder 1.6 millioner rækker men tabellen ca. 2000 rækker. Så det svarer til at csv filen skal køres igennem 2000 gange, hvilket tager en dl tid .-)
Avatar billede j4k0b Nybegynder
21. april 2009 - 15:11 #3
$handle = fopen('cvr1.csv', 'r');
$csvdata = array();
while($data = fgetcsv($handle, 1000, ';')) {
    if($data[2]) {
        $csvdata[] = $data[1];
    }
}


$sql = 'SELECT cvr FROM virksomheder WHERE cvr > 0';
$res = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_array($res)) {
    if($row['cvr'], $csvdata) {
        print 'Dublicate: '.$row['cvr'].'<br>';
    }
}
Avatar billede j4k0b Nybegynder
21. april 2009 - 15:12 #4
ups mangler lige et funktionsnavn :)


while($row = mysql_fetch_array($res)) {
    if(in_array($row['cvr'], $csvdata)) {
        print 'Dublicate: '.$row['cvr'].'<br>';
    }
}


ps har ikke testet
Avatar billede axel21 Juniormester
02. juli 2010 - 21:58 #5
Smid et svar, ellers bliver tråden lukket...
Avatar billede j4k0b Nybegynder
03. juli 2010 - 08:20 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester