Un des avantages des procédures stockées est une bonne vitesse. J'ai fait des tests et obtenu des résultats étranges!Les procédures stockées simples sont plus lentes que les requêtes standard! Pourquoi?
Scénario: Il existe 2 tables, agents et sociétés InnoDB. Chaque agent est lié à une entreprise via FK et indexé sont corrects. S'il vous plaît examiner les moyens ci-dessous:
Deux requêtes simples:
$agent = $pdo->query("SELECT * FROM agents WHERE id=3")->fetch(PDO::FETCH_ASSOC);
$company = $pdo->query("SELECT name FROM companies WHERE id='$agent[company]'")->fetch(PDO::FETCH_ASSOC);
$name = $company['name'];
// 0.000793933868408
// 0.000741958618164
Une requête avec JOIN
$agent = $pdo->query("
SELECT agents.*, companies.name FROM agents
LEFT JOIN companies ON companies.id=agents.company
WHERE agents.id=3
")->fetch(PDO::FETCH_ASSOC);
$name = $agent['name'];
// 0.000327110290527
// 0.00028395652771
Deux SP appelle:
$agent = $pdo->query("CALL agents('3')")->fetch(PDO::FETCH_ASSOC);
$partner = $pdo->query("CALL companies('$agent[company]')")->fetch(PDO::FETCH_ASSOC);
$name = $agent['name'];
// 0.010176897049
// 0.010200023651
/*
CREATE PROCEDURE `agents`(agent INT(10))
BEGIN SELECT * FROM agents WHERE id=agent; END
CREATE PROCEDURE `companies`(company INT(10))
BEGIN SELECT * FROM companies WHERE id=company; END
*/
Un appel SP avec JOIN:
$agent = $pdo->query("CALL agents('3')")->fetch();
$name = $agent['name'];
// 0.00241208076477
// 0.00252604484558
/*
CREATE PROCEDURE `agents`(agent INT(10))
BEGIN
SELECT agents.*, companies.name FROM agents
LEFT JOIN companies ON companies.id=agents.company
WHERE agents.id=agent;
END
*/
Comment ces SP simples sont lents comme vous avez vu? L'environnement PDO ou système peut-il le provoquer? Comme je sais SP fonctionne très bien pour les requêtes simples, mais ici .....
S'il vous plaît noter que les temps ci-dessus ont été recopiés après 3 fois en cours d'exécution.
Merci AHHP
Merci @GolezTrol pour une réponse détaillée.A propos de la mise en cache, j'ai couru des requêtes plusieurs fois et le résultat est pour les derniers tests donc quereis devait être mis en cache. A propos du 2ème paragraphe, comme je l'ai découvert, SP ne fait des requêtes rapides que via la mise en cache? Au sujet du 3ème paragraphe, pourriez-vous m'expliquer davantage? Utiliser des SP en tant que processeur (ne pas retourner de données, juste faire quelque chose) les rend un peu inutiles! Je n'ai pas compris votre signification. Et au sujet du dernier paragraphe, mon test n'est pas un point de référence. Dans mon test j'ai une variable et je veux obtenir un champ de sa relation. Je cherche à faire de telles tâches de la meilleure façon de ne pas discuter des tests MySQL – AHHP
Le troisième paragraphe se réfère à ce que je dis dans le dernier. Vous pouvez utiliser des procédures stockées pour traiter des données et les renvoyer. Dans votre cas, vous exécutez simplement la requête, renvoyez son résultat, et c'est tout. La procédure stockée doit donc pouvoir s'exécuter au minimum le temps nécessaire à l'exécution de la procédure, car c'est ce qu'elle fait exactement, plus un léger surcoût d'appel de la procédure elle-même. Si l'encapsulation d'une requête comme celle-ci dans une procédure stockée le rendrait plus rapide, tout le monde le ferait. Ou plus probablement, cela serait fait automatiquement par MySQL. :) – GolezTrol