Optimisation d'un code d'insertion de ligne dans SQL

Fermé
hypo - 1 juin 2020 à 11:27
Zempachi Messages postés 7472 Date d'inscription vendredi 14 octobre 2005 Statut Contributeur Dernière intervention 5 juin 2020 - 3 juin 2020 à 15:02
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 :

$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:

2 réponses

jordane45 Messages postés 38273 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 novembre 2024 4 696
1 juin 2020 à 11:31
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à.


2
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 !
0
Zempachi Messages postés 7472 Date d'inscription vendredi 14 octobre 2005 Statut Contributeur Dernière intervention 5 juin 2020 906
Modifié le 3 juin 2020 à 15:02
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.
0