sql >> Database >  >> RDS >> Mysql

MySQL:vergelijking van integerwaarde en stringveld met index

Het essentiële punt is dat de index niet kan worden gebruikt als de database een conversie moet doen aan de tabelzijde van de vergelijking.

Daarnaast dekt de DB altijd Strings -> Numbers omdat dit de deterministische manier is (anders zou 1 kunnen worden omgezet in '01', '001' zoals vermeld in de opmerkingen).

Dus, als we de twee gevallen vergelijken die u in verwarring lijken te brengen:

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

De DB converteert de string '1' naar het nummer 1 en voert vervolgens de query uit. Het heeft eindelijk int aan beide kanten, zodat het de index kan gebruiken.

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

Nogmaals, het converteert de string naar getallen. Deze keer moet het echter de gegevens die in de tabel zijn opgeslagen, converteren. In feite voert u een zoekopdracht uit zoals cast(str_column as int) = 1 . Dat betekent dat u niet meer zoekt op de geïndexeerde gegevens, de DB kan niet gebruik de index.

Bekijk dit voor meer informatie:




  1. Postgres-caches/buffers zien en wissen?

  2. Beste MySQL-tool voor het afstemmen van prestaties?

  3. MySQL Galera-clusterreplicatie gebruiken om een ​​geo-gedistribueerde cluster te maken:deel één

  4. SQL Fuzzy Matching