Optimisation d'un code d'insertion de ligne dans SQL
hypo
-
Zempachi Messages postés 7472 Date d'inscription Statut Contributeur Dernière intervention -
Zempachi Messages postés 7472 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je prépare une petit moteur de recherche dédié et j'ai besoin pour ça de charger des urls dans ma base de donnée, pour ce faire je scan des sitemap et récupère les url contenues dans les balise loc, voilà mon code d'insertion :
le soucis c'est qu'en laissant mon script tourner toute la nuit il n'a récupéré "que" 280k urls,
je pense que le soucis vien de:
plus il y a d'entrées plus sql met de temps a effectuer cette requête je suppose.
Comment pourrais-je optimiser ce code de sorte de charger ces sitemap en bloc ?
Merci de vos conseils.
Je prépare une petit moteur de recherche dédié et j'ai besoin pour ça de charger des urls dans ma base de donnée, pour ce faire je scan des sitemap et récupère les url contenues dans les balise loc, voilà mon code d'insertion :
$dom = new DOMDocument (); $dom->loadXML("le-sitemap.xml"); $urls = $dom->getElementsByTagName("loc"); foreach ($urls as $key) { $url = $key->nodeValue; global $bd; $sql = 'SELECT id from urls-du-site WHERE url = "'.$url.'"'; $req = $bd->prepare($sql); $req->execute(); $result = $req->fetch(); if ($result === FALSE ) { $sql = 'INSERT INTO urls-du-site (url) VALUES ("'.$url.'")'; $req = $bd->prepare($sql); $req->execute(); echo "ajout de: ".$url."<br>"; } else { echo "url déjà ajoutée: ".$url."<br>"; }
le soucis c'est qu'en laissant mon script tourner toute la nuit il n'a récupéré "que" 280k urls,
je pense que le soucis vien de:
$sql = 'SELECT id from urls-du-site WHERE url = "'.$url.'"';
plus il y a d'entrées plus sql met de temps a effectuer cette requête je suppose.
Comment pourrais-je optimiser ce code de sorte de charger ces sitemap en bloc ?
Merci de vos conseils.
A voir également:
- Optimisation d'un code d'insertion de ligne dans SQL
- Code ascii - Guide
- Optimisation pc - Accueil - Utilitaires
- Partage de photos en ligne - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
2 réponses
Bonjour,
Pour commencer....as tu mis un INDEX sur ta table sur le champ URL ?
cela devrait déjà bien accélérer ta requête.
Ensuite, au lieu de directement regarder en BDD puis faire l'insertion ...
Tu devrais stocker toutes les URL du sitemap que tu regardes dans un array
Travailler sur cet array pour retirer les éventuels doublons
Faire une seule requête pour lister toutes les URL que tu as déjà en BDD qui sont dans ton array ( via un IN )
Puis faire l'insertion de celles qui n'y sont pas déjà.
Pour commencer....as tu mis un INDEX sur ta table sur le champ URL ?
cela devrait déjà bien accélérer ta requête.
Ensuite, au lieu de directement regarder en BDD puis faire l'insertion ...
Tu devrais stocker toutes les URL du sitemap que tu regardes dans un array
Travailler sur cet array pour retirer les éventuels doublons
Faire une seule requête pour lister toutes les URL que tu as déjà en BDD qui sont dans ton array ( via un IN )
Puis faire l'insertion de celles qui n'y sont pas déjà.
Ok, je vais essayer pour le array (en vérité vu que les sitemaps on quelque 50k+ urls chacuns a vu de nez, je me disais que ce serait pas possible comme ça).
En revanche je ne connaisser pas les index sql ... j'ai regarder un peut sur le net, tu parle bien de CREATE INDEX ? je vais le faire aussi du coups.
Donc merci pour ton aide !
En revanche je ne connaisser pas les index sql ... j'ai regarder un peut sur le net, tu parle bien de CREATE INDEX ? je vais le faire aussi du coups.
Donc merci pour ton aide !
Si ton tableau est vraiment très grand (et donc pour éviter les erreurs de memory_limit) alors une technique serait de créer une table temporaire (TEMPORARY TABLE) dans laquelle tu stockerais toutes les URLs du sitemap.
Il sera alors possible de faire des "INSERT SELECT" à partir de cette table temporaire.
Il sera alors possible de faire des "INSERT SELECT" à partir de cette table temporaire.