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

Les requêtes MySQL sont rapides lorsqu'elles sont exécutées directement, mais très lentes lorsqu'elles sont exécutées en tant que proc stocké

J'ai eu le même problème. Après avoir fait des recherches pendant un certain temps, j'ai découvert que le problème était le problème de classement pendant que MySQL comparait du texte.

TL;DR : la table a été créée dans un classement alors que MySQL "pensait" que la variable se trouvait dans un autre classement. Par conséquent, MySQL ne peut pas utiliser l'index destiné à la requête.

Dans mon cas, la table a été créée avec (latin1 , latin1_swedish_ci ) classement. Pour que MySQL utilise l'index, j'ai dû changer le where clause dans la procédure stockée de

    UPDATE ... WHERE mycolumn = myvariable

à

    UPDATE ... WHERE mycolumn = 
        convert(myvariable using latin1) collate latin1_swedish_ci

Après le changement, la procédure stockée ressemblait à ceci :

    CREATE PROCEDURE foo.'bar'()
    BEGIN
        UPDATE mytable SET mycolumn1 = variable1
        WHERE mycolumn2 = 
            convert(variable2 using latin1) collate latin1_swedish_ci
    END;

où (latin1 , latin1_swedish_ci ) est le même classement que mon tableA a été créé avec.

Pour vérifier si MySQL utilise l'index ou non, vous pouvez modifier la procédure stockée pour exécuter un explain déclaration comme suit :

    CREATE PROCEDURE foo.'bar'()
    BEGIN
        EXPLAIN SELECT * FROM table WHERE mycolumn2 = variable2
    END;

Dans mon cas, le explain résultat a montré qu'aucun index n'a été utilisé lors de l'exécution de la requête.

Notez que MySQL peut utiliser l'index lorsque vous exécutez la requête seule, mais n'utilisera toujours pas l'index pour la même requête dans une procédure stockée, peut-être parce que MySQL voit la variable dans un autre classement.

Vous trouverez plus d'informations sur le problème de classement ici :http://lowleveldesign.wordpress.com/2013/07/19/diagnosing-collation-issue-mysql-stored-procedure/ Lien de sauvegarde :http ://www.codeproject.com/Articles/623272/Diagnosing-a-collation-issue-in-a-MySQL-stored-pro