Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

As consultas do MySQL são rápidas quando executadas diretamente, mas muito lentas quando executadas como proc armazenado


Eu tive o mesmo problema. Depois de pesquisar por um tempo, descobri que o problema era o problema de agrupamento enquanto o MySQL estava comparando texto.

TL;DR: a tabela foi criada em um agrupamento enquanto o MySQL "pensava" que a variável estava em outro agrupamento. Portanto, o MySQL não pode usar o índice pretendido para a consulta.

No meu caso, a tabela foi criada com (latin1 , latin1_swedish_ci ) colação. Para fazer o MySQL usar o índice, tive que alterar o where cláusula no procedimento armazenado de
    UPDATE ... WHERE mycolumn = myvariable

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

Após a alteração, o procedimento armazenado ficou assim:
    CREATE PROCEDURE foo.'bar'()
    BEGIN
        UPDATE mytable SET mycolumn1 = variable1
        WHERE mycolumn2 = 
            convert(variable2 using latin1) collate latin1_swedish_ci
    END;

onde (latin1 , latin1_swedish_ci ) é o mesmo agrupamento que minha tableA foi criado com.

Para verificar se o MySQL usa o índice ou não, você pode alterar o procedimento armazenado para executar um explain declaração a seguir:
    CREATE PROCEDURE foo.'bar'()
    BEGIN
        EXPLAIN SELECT * FROM table WHERE mycolumn2 = variable2
    END;

No meu caso, o explain resultado mostrou que nenhum índice foi usado durante a execução da consulta.

Observe que o MySQL pode usar o índice quando você executa a consulta sozinho, mas ainda não usará o índice para a mesma consulta dentro de um procedimento armazenado, talvez porque de alguma forma o MySQL vê a variável em outro agrupamento.

Mais informações sobre o problema de agrupamento podem ser encontradas aqui:http://lowleveldesign.wordpress.com/2013/07/19/diagnosing-collation-issue-mysql-stored-procedure/ Link de backup:http ://www.codeproject.com/Articles/623272/Diagnosing-a-collation-issue-in-a-MySQL-stored-pro