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

MySQL:porównanie wartości całkowitej i pola tekstowego z indeksem

Najważniejsze jest to, że indeks nie może być użyty, jeśli baza danych musi wykonać konwersję po stronie tabeli porównania.

Poza tym DB zawsze ukrywa Ciągi -> Liczby, ponieważ jest to deterministyczny sposób (w przeciwnym razie 1 można by przekonwertować na '01', '001', jak wspomniano w komentarzach).

Tak więc, jeśli porównamy dwa przypadki, które wydają się być zdezorientowane:

-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';

DB konwertuje ciąg '1' na liczbę 1, a następnie wykonuje zapytanie. W końcu ma int po obu stronach, więc może korzystać z indeksu.

-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;

Ponownie konwertuje ciąg na liczby. Jednak tym razem musi przekonwertować dane zapisane w tabeli. W rzeczywistości przeprowadzasz wyszukiwanie takie jak cast(str_column as int) = 1 . Oznacza to, że nie wyszukujesz już zindeksowanych danych, DB nie może użyj indeksu.

Proszę spojrzeć na to, aby uzyskać więcej informacji:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobieranie pojedynczego wiersza, pojedynczej kolumny z PDO

  2. Jak konwertować wielkie litery na małe litery w MySQL

  3. Django, po aktualizacji:serwer MySQL zniknął

  4. Typ danych/struktura do przechowywania przesunięcia strefy czasowej w MySQL

  5. Zapytanie o dynamiczną aktualizację PHP PDO do MYSQL