Optimisation script import entre deux BDD MySQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Optimisation script import entre deux BDD MySQL

Re: Optimisation script import entre deux BDD MySQL

par SnY75 » 20 mars 2016, 18:13

J'ai des partitions sur l'une des tables, mais la requête suivante ne donne rien :
select * from table partition (p1)
MySQL me dit que c'est une erreur de syntaxe (MySQL 5).

Re: Optimisation script import entre deux BDD MySQL

par yann18 » 20 mars 2016, 13:46

La BDD1 est BDD2 ne sont pas sur le même serveur.
le fait que les 2 BDs se trouvent sur des serveurs différents ne change rien au problème car les 2 bases restent accessibles une fois la connexion initialisée. Pour utiliser les tables de l'une ou de l'autre base, il faut préfixer le nom de la table par la base concernée.
Actuellement je met une condition "where datetime > 1 jour".
il est tout à fait possible d'inclure cette condition dans la requête pour accélérer la lecture
$sql ="
INSERT INTO BD1.table_A ( id, nom, pnom )
SELECT ta.id, ta.nom, ta.pnom
FROM BD2.table_A ta
WHERE datetime > 1 jour
ON DUPLICATE KEY UPDATE BD1.table_A.id=BD1.table_A.id
";

Re: Optimisation script import entre deux BDD MySQL

par SnY75 » 19 mars 2016, 23:42

Bonsoir,
Deux précisions :
La BDD1 est BDD2 ne sont pas sur le même serveur.
La récupération de données est à faire pour chaque site (donc boucle obligatoire) et dans la BDD2 j'ai plus de 160 millions de lignes dans cette dernière ...
Actuellement je met une condition "where datetime > 1 jour".

Re: Optimisation script import entre deux BDD MySQL

par yann18 » 19 mars 2016, 22:49

bonsoir,
En une seule requête, tu peux lancer l'insertion des données de la BD1 à la suite d'une extraction des données de la BD2:
$sql ="

INSERT INTO BD1.table_A ( id, nom, pnom )
SELECT ta.id, ta.nom, ta.pnom
FROM BD2.table_A ta
ON DUPLICATE KEY UPDATE BD1.table_A.id=BD1.table_A.id

";
//la clause ON DUPLICATE KEY UPDATE... employée ici permet d'ignorer les données déjà existantes dans la BD1
Sinon si tu souhaites copier toutes les tables de la BD2 vers la BD1 l'idéal serait de mettre en place un système de réplication: tu fixes une bd maître (BD2) et une bd esclave(BD1) qui récopie toutes les modifs de la BD1

Optimisation script import entre deux BDD MySQL

par SnY75 » 19 mars 2016, 15:49

J'ai un script PHP qui se connecte sur deux BDD MySQL pour faire un import.
Je trouve que le script es très long à s'exécuter et j'aimerai bien optimiser cela.

En gros j'ai un 1er foreach où je parcourt mes sites (des centaines), ceux-ci ont dans ma 1ere BDD MySQL.

Pour chaque site je récupère les données dans une 2éme BDD.

Je regarde le nombre de ligne pour le site en question, si > 1 je fait une 2éme boucle foreach et pour chaque ligne j'insère les champs dans ma BDD.

Code : Tout sélectionner

foreach ($_LISTE_DES_SITES as $site) { [b]Requête 1 :[/b] récupération des données pour chaque "site" sur la 2éme BDD MySQL. $nombre_ligne_temps = sizeof($_data_1); foreach ($_data_1 as $temps) { $nombre_ligne_temps--; [b]Requête 2 :[/b] vérification de la présence de ces données dans la 1er BDD if (sizeof($test) < 1) { [b] Requête 3 :[/b] insertion des données de la 2éme BDD dans la 1ére BDD si les données n'existent pas mysqli_query($con, $q); } else { [b]Requête 3 bis :[/b] update si les donnée existent } }