Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:confronto tra valore intero e campo stringa con indice

Il punto essenziale è che l'indice non può essere utilizzato se il database deve eseguire una conversione sul lato tabella del confronto.

Oltre a ciò, il DB copre sempre Strings -> Numbers perché questo è il modo deterministico (altrimenti 1 potrebbe essere convertito in '01', '001' come menzionato nei commenti).

Quindi, se confrontiamo i due casi che sembrano confonderti:

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

Il DB converte la stringa '1' nel numero 1 e quindi esegue la query. Alla fine ha int su entrambi i lati in modo da poter utilizzare l'indice.

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

Di nuovo, converte la stringa in numeri. Tuttavia, questa volta deve convertire i dati memorizzati nella tabella. In effetti, stai eseguendo una ricerca come cast(str_column as int) = 1 . Ciò significa che non stai più cercando nei dati indicizzati, il DB non può usa l'indice.

Si prega di dare un'occhiata a questo per ulteriori dettagli: