Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytania MySQL są szybkie, gdy są uruchamiane bezpośrednio, ale naprawdę wolno, gdy są uruchamiane jako przechowywane proc

Miałem ten sam problem. Po pewnym czasie badań odkryłem, że problem polegał na tym, że MySQL porównywał tekst.

TL;DR: tabela została utworzona w jednym zestawieniu, podczas gdy MySQL „pomyślał”, że zmienna jest w innym zestawieniu. Dlatego MySQL nie może używać indeksu przeznaczonego dla zapytania.

W moim przypadku tabela została utworzona za pomocą (latin1 , latin1_swedish_ci ) zestawienie. Aby MySQL używał indeksu, musiałem zmienić where klauzula w procedurze składowanej z

    UPDATE ... WHERE mycolumn = myvariable

do

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

Po zmianie procedura składowana wyglądała mniej więcej tak:

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

gdzie (latin1 , latin1_swedish_ci ) jest tym samym zestawieniem, co moja tabelaA został utworzony za pomocą.

Aby sprawdzić, czy MySQL używa indeksu, czy nie, możesz zmienić procedurę składowaną, aby uruchomić explain następujące oświadczenie:

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

W moim przypadku explain wynik pokazał, że podczas wykonywania zapytania nie został użyty żaden indeks.

Zwróć uwagę, że MySQL może używać indeksu, gdy uruchamiasz samo zapytanie, ale nadal nie użyje indeksu dla tego samego zapytania wewnątrz procedury składowanej, co może być spowodowane tym, że MySQL widzi zmienną w innym zestawieniu.

Więcej informacji na temat sortowania można znaleźć tutaj:http://lowleveldesign.wordpress.com/2013/07/19/diagnosing-collation-issue-mysql-stored-procedure/ Link do kopii zapasowej:http ://www.codeproject.com/Articles/623272/Diagnosing-a-collation-issue-in-a-MySQL-stored-pro



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql nie zlicza wierszy dwa razy, jeśli dane w kolumnie są zduplikowane

  2. Używanie PHP do wykonywania wielu zapytań MYSQL

  3. Kiedy używać pojedynczych cudzysłowów, podwójnych cudzysłowów i znaków wstecznych w MySQL

  4. Jak mogę używać DATE() w Doctrine 2 DQL?

  5. Rozwiązywanie problemów z nieprawidłowym kodowaniem znaków podczas wyświetlania wyników bazy danych MySQL po aktualizacji do PHP 5.3