Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfragen sind schnell, wenn sie direkt ausgeführt werden, aber sehr langsam, wenn sie als gespeicherte Prozedur ausgeführt werden

Ich hatte das gleiche Problem. Nachdem ich eine Weile recherchiert hatte, fand ich heraus, dass das Problem das Sortierungsproblem war, während MySQL Text vergleicht.

TL;DR: Die Tabelle wurde in einer Sortierung erstellt, während MySQL „dachte“, die Variable befinde sich in einer anderen Sortierung. Daher kann MySQL den für die Abfrage vorgesehenen Index nicht verwenden.

In meinem Fall wurde die Tabelle mit (latin1 erstellt , latin1_swedish_ci ) Zusammenstellung. Damit MySQL den Index verwendet, musste ich das where ändern -Klausel in der gespeicherten Prozedur von

    UPDATE ... WHERE mycolumn = myvariable

zu

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

Nach der Änderung sah die gespeicherte Prozedur etwa so aus:

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

wobei (latin1 , latin1_swedish_ci ) ist dieselbe Sortierung wie meine tableA wurde erstellt mit.

Um zu überprüfen, ob MySQL den Index verwendet oder nicht, können Sie die gespeicherte Prozedur so ändern, dass ein explain ausgeführt wird Anweisung wie folgt:

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

In meinem Fall das explain Das Ergebnis zeigte, dass während der Ausführung der Abfrage kein Index verwendet wurde.

Beachten Sie, dass MySQL den Index verwenden kann, wenn Sie die Abfrage alleine ausführen, aber dennoch nicht den Index für dieselbe Abfrage innerhalb einer gespeicherten Prozedur verwendet, was möglicherweise daran liegt, dass MySQL die Variable irgendwie in einer anderen Sortierung sieht.

Weitere Informationen zum Sortierungsproblem finden Sie hier:http://lowleveldesign.wordpress.com/2013/07/19/diagnosing-collation-issue-mysql-stored-procedure/ Sicherungslink:http ://www.codeproject.com/Articles/623272/Diagnosing-a-collation-issue-in-a-MySQL-stored-pro