10 votes

Une requête simple est lente dans Laravel, mais incroyablement rapide dans la console de base de données

J'ai un problème très étrange, que je n'arrive pas à cerner. J'utilise Laravel pour mon application backend, où j'exécute une requête très simple sur une table avec 30k enregistrements, tous avec des index appropriés. Voici la requête :

DB::select('select * from Orders where ClientId = ?', [$id])

Depuis l'application Laravel, cette requête s'exécute pendant 1,2 secondes (la même chose se produit si j'utilise le modèle Eloquent) :

    "query" => "select * from Orders where ClientId = ?"
    "bindings" => array:1 [
      0 => "44087"
    ]
    "time" => 1015.2

Le problème est que si je lance la même requête dans la console de la base de données ou dans PHPMyAdmin, la requête prend environ 20 millisecondes.

Je ne comprends pas comment cela est possible puisque j'utilise la même base de données, la même requête, le même ordinateur et la même connexion à la base de données.

Quelle peut en être la raison ?

4voto

Unamata Sanatarai Points 1215

PHPMyAdmin ajoutera automatiquement LIMIT pour vous.

En effet, PHPMyAdmin pagine toujours par défaut votre requête.

Dans votre requête Laravel/Eloquent, vous chargez les 30 000 enregistrements en une seule fois. Cela doit prendre du temps.

Pour y remédier, essayez pagination o découpage votre demande.

Le total prendra du temps, certes, mais les morceaux eux-mêmes seront très rapides.

1voto

user11324665 Points 64

J'essaierais de déboguer les requêtes avec la barre de débogage, pour voir combien de temps cela prend, et ce qui prend le plus de temps,... C'est très facile à utiliser et à installer : https://github.com/barryvdh/laravel-debugbar Je pense que vous êtes intéressé par l'administration des bases de données. Lisez aussi ceci, vous aurez une idée.

0voto

ICE Points 1052

Je suis presque sûr que cela est dû à la limite d'utilisation de PHPMyAdmin, liée à ce que vous voyez dans la sortie de la page.

Si vous regardez en haut de la page PHPMyAdmin, vous verrez quelque chose comme ceci :

Affichage des lignes 0 - 24 (314 au total, la requête a pris 0,0009 seconde).

Vous devriez obtenir les mêmes performances lorsque vous ajoutez la limite à votre requête.

0voto

gaRex Points 2422
  1. Comment activer le journal des requêtes MySQL ?
  2. Exécutez la requête par l'intermédiaire de phpmyadmin.
  3. Voyez quelles sont les requêtes que vous avez actuellement dans MySQL.
  4. Exécuter l'application.
  5. Voyez quelles sont les requêtes que vous avez actuellement dans MySQL.
  6. Dites-nous ce qu'il y avait de plus, ce qui ralentit.

0voto

Dragas Points 105

Plusieurs questions se posent ici. Le premier est la façon dont laravel fonctionne. Laravel ne charge que les services et les classes qui sont exécutés pendant votre script. Ceci est fait pour conserver les ressources, puisque PHP est conçu pour être exécuté comme un script CGI au lieu d'un long processus en cours d'exécution. Par conséquent, votre timing peut inclure l'étape d'établissement de la connexion au lieu de simplement exécuter la requête. Pour un résultat plus "fiable", exécutez n'importe quelle requête avant de chronométrer votre requête simple.

Il y a un autre aspect à ce comportement. Dans les processus de longue durée, comme le Job runner, vous ne devez pas modifier les paramètres du service. Cela peut entraîner un comportement indésirable et faire en sorte que vos modifications de paramètres se répercutent sur d'autres travaux. Par exemple, si vous proposez une fonction de connexion SMTP, vous devez réinitialiser les informations d'identification de l'expéditeur après l'envoi du courrier électronique, faute de quoi un utilisateur qui n'utilise pas cette fonction enverra un courrier électronique au nom d'un autre utilisateur qui l'utilise. Cela vient du fait que l'on pense que les services sont rechargés à chaque fois qu'un travail est exécuté, ce qui est le cas lors de l'exécution d'une partie HTTP.

Deuxièmement, vous n'utilisez pas de limite. Comme l'ont souligné d'autres affiches.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X