Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.
Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi
Come puoi vedere effettuando queste prove l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.
Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.
Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.
Prevedi 2 variabili nel modello di gestione dati:
PHP:
public $data_insert=[];
public $data_update=[];
[QUOTE="macus_adi, post: 205054, member: 35357"]Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.
Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi
Come puoi vedere effettuando queste prove l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.
Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.
Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.
Prevedi 2 variabili nel modello di gestione dati:
[PHP]
public $data_insert=[];
public $data_update=[];
Effettua tutta la porzione di codice che serve alla fine dividi l'array in pacchetti da 200/250 e inserisci/aggiorni in batch.
Credo sia abbastanza chiaro il concetto.!
Qui il codice (CI) per la verifica dei tempi, crea una tabella con id,text1,text2,text3,text4 e aggiungi nell'autoload l'helper string.
PHP:
private $num_rows=25000;
private $model=['text1','text2','text3','text4'];
private $data=[];
public function __construct() {
parent::__construct();
$this->crea_dati_inserimento();
}
public function crea_dati_inserimento(){
for($i=0;$i<$this->num_rows;$i++){
foreach ($this->model as $items){
$this->data[$i][$items]=random_string('alnum',rand(5,20));
}
}
}
public function carica_dati_one_row(){
set_time_limit(0);
$this->benchmark->mark('code_start');
foreach ($this->data as $k=>$v){
$this->db->insert('table1',$v);
}
/**
* Inserimento batch
*/
/*
$a=array_chunk($this->data,250);
foreach ($a as $items){
$this->db->insert_batch('table1',$items);
}*/
$this->benchmark->mark('code_end');
echo $this->benchmark->elapsed_time('code_start', 'code_end');
}