sql >> Databáze >  >> RDS >> Mysql

MySQL:porovnání celočíselné hodnoty a pole řetězce s indexem

Podstatné je, že index nelze použít, pokud databáze musí provést konverzi na straně tabulky srovnání.

Kromě toho DB vždy skrývá Strings -> Numbers, protože toto je deterministický způsob (jinak by 1 mohla být převedena na '01', '001', jak je uvedeno v komentářích).

Pokud tedy porovnáme dva případy, které vás zmást:

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

DB převede řetězec '1' na číslo 1 a poté provede dotaz. Konečně má na obou stranách int, takže může používat index.

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

Opět převede řetězec na čísla. Tentokrát však musí převést data uložená v tabulce. Ve skutečnosti provádíte vyhledávání jako cast(str_column as int) = 1 . To znamená, že už v indexovaných datech nevyhledáváte, DB to nemůže použijte index.

Další podrobnosti naleznete zde:




  1. Funkce MySQL DEGREES() – Převod z radiánů na stupně

  2. SQL UPDATE s dílčím dotazem, který odkazuje na stejnou tabulku v MySQL

  3. automatické dělení databáze mysql

  4. pouze data mysqldump