sql >> Databasteknik >  >> RDS >> Mysql

MySQL:jämförelse av heltalsvärde och strängfält med index

Det väsentliga är att indexet inte kan användas om databasen måste göra en konvertering på tabellsidan av jämförelsen.

Dessutom döljer DB alltid Strings -> Numbers eftersom detta är det deterministiska sättet (annars kan 1 konverteras till '01', '001' som nämnts i kommentarerna).

Så om vi jämför de två fallen som verkar förvirra dig:

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

DB:n konverterar strängen '1' till siffran 1 och exekverar sedan frågan. Den har äntligen int på båda sidor så att den kan använda indexet.

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

Återigen konverterar den strängen till siffror. Den här gången måste den dock konvertera data som lagras i tabellen. Faktum är att du utför en sökning som cast(str_column as int) = 1 . Det betyder att du inte längre söker på den indexerade informationen, DB kan inte använd indexet.

Ta en titt på detta för mer information:




  1. SQLiteConstraintException-fel visas efter start av varje aktivitet

  2. Slår samman 3 tabeller/frågor med MS Access Union Query

  3. Välj olåst rad i Postgresql

  4. Partitionsfunktion COUNT() OVER möjlig med DISTINCT