php - Last opp stor CSV-fil på omtrent 10 000 000 poster i MySQL-tabell, den inneholder også dupliserte rader


Jeg vil laste opp en stor CSV-fil med omtrent 10 000 000 poster i en MySQL-tabell som allerede inneholder samme eller flere poster, samt noen dupliserte poster. Jeg prøvde Local data infile, men det tar også mye tid. Hvordan kan jeg løse dette uten å vente lenge? Hvis det ikke kan løses, hvordan kan jeg gjøre det med AJAX for å sende noen poster og prosessere dem om gangen, og fortsette til hele CSV-filen er lastet opp/prosessert.

Svar #1

LOAD DATA INFILE blir ikke slått på hastighet. Det er noen ting du kan gjøre for å få det til å gå raskere:

  • Slett eller deaktiver noen indekser (men selvfølgelig må du vente på at de bygges opp igjen etter belastningen. Men dette er ofte raskere). Hvis du bruker MyISAM, kan du ALTER TABLE *foo* DISABLE KEYS, men InnoDB støtter dessverre ikke det. Du må i stedet slette dem.
  • Optimaliser innstillingene i my.cnf. Spesielt kan du kanskje deaktivere mange sikkerhetsfunksjoner (som fsync). Selvfølgelig, hvis du får et krasj, må du gjenopprette en sikkerhetskopi og starte lastingen på nytt. Hvis du kjører standard my.cnf, er den forresten, sist jeg sjekket, ganske suboptimal for en databasemaskin. Det finnes mange guider for tuning tilgjengelig.
  • Kjøp raskere maskinvare. Eller lei noe (f.eks. prøv en rask Amazon ECC-instans).
  • Som @ZendDevel nevner, vurder andre datalagringsløsninger hvis du ikke er bundet til MySQL. For eksempel, hvis du bare lagrer en liste med telefonnumre (og noen data med dem), vil en enkel hashtabell være mange ganger raskere.

Hvis problemet er at det ødelegger databaseytelsen, kan du dele CSV-filen din i flere CSV-filer og laste dem inn i deler.

Svar #2

Prøv dette:

load data local infile '/yourcsvfile.csv' into table yourtable fields terminated by ',' lines terminated by '\r\n'