Domanda

Ho un retaggio php web app che esegue Csv -> le importazioni di database, in una tabella 'master' che memorizza i dati di entità, e una tabella di entità-attributo-valore che memorizza i dati dinamici per ogni entità.

Il processo di importazione è un'iterazione linea per linea attraverso il file CSV, con un inserimento nella tabella master e più inserimenti nella tabella EAV per ogni linea.

Questo processo è Sloow, e quel poco che so su di sintonia mysql mi dice che una dichiarazione LOAD DATA è in genere molto più veloce di una serie di inserti; tuttavia, a causa del processo di EAV l'iterazione avrebbe ancora a verificarsi, anche se in base al largo i risultati di una query di database piuttosto che il file CSV.

  • Ne vale la pena di fare la modifica?

  • Lo fa fare la differenza se ci sono decine di milioni di record in ogni file, con in genere meno di 2/3 dei campi del file effettivamente mappati agli attributi?

È stato utile?

Soluzione

suona come una modifica utile. Quello che vorrei fare è pre-processo del CSV in due file - master e EAV tavoli. La parte difficile è stabilire una sorta di collegamento tra questi due file in modo da poter inserire nella tabella EAV con la chiave esterna corretta.

Il problema è semplificato se:

  1. è possibile bloccare qualsiasi altro accesso in scrittura al sistema mentre si esegue il carico
  2. la chiave primaria tabella principale è un intero incremento

In questo caso, si può facilmente "conoscere" il valore chiave esterna EAV prima del tempo e impostare in modo appropriato prima di caricare i dati di entrambe le tabelle.

In caso contrario, sarà necessario capire come ottenere il valore della chiave primaria per i record della tabella master, posta LOAD DATA, e collegarsi con i record EAV conseguenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top