Mysql
 sql >> Base de données >  >> RDS >> Mysql

La procédure stockée mysql est 20 fois plus lente que la requête standard

Juste une supposition :

Lorsque vous exécutez la requête manuellement, l'expression WHERE ('test' IS NULL or COL1 = 'test') peut être optimisé lors de l'analyse de la requête. L'analyseur peut voir que la chaîne 'test' n'est pas nul, il convertit donc le test en WHERE COL1 = 'test' . Et s'il y a un index sur COL1 cela sera utilisé.

Toutefois, lorsque vous créez une procédure stockée, l'analyse se produit lors de la création de la procédure. A ce moment, il ne sait pas ce que @param sera, et doit implémenter la requête comme une analyse séquentielle de la table.

Essayez de modifier votre procédure en :

IF @param IS NULL
THEN BEGIN
  SELECT * FROM table1
  UNION ALL
  SELECT * FROM table2
  ...
END;
ELSE BEGIN
  SELECT * FROM table1 WHERE col1 = @param
  UNION ALL
  SELECT * FROM table2 WHERE col1 = @param
  ...
END;
END IF;

Je n'ai pas beaucoup d'expérience avec les procédures stockées MySQL, donc je ne suis pas sûr que ce soit la bonne syntaxe.