Intinya adalah bahwa indeks tidak dapat digunakan jika database harus melakukan konversi di sisi tabel perbandingan.
Selain itu, DB selalu menyembunyikan String -> Angka karena ini adalah cara deterministik (jika tidak, 1 dapat dikonversi menjadi '01', '001' seperti yang disebutkan dalam komentar).
Jadi, jika kita membandingkan dua kasus yang tampaknya membingungkan Anda:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DB mengonversi string '1' menjadi angka 1 dan kemudian mengeksekusi kueri. Akhirnya memiliki int di kedua sisi sehingga dapat menggunakan indeks.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Sekali lagi, ini mengubah string menjadi angka. Namun, kali ini harus mengonversi data yang disimpan dalam tabel. Faktanya, Anda melakukan pencarian seperti cast(str_column as int) = 1
. Artinya, Anda tidak mencari di data yang diindeks lagi, DB tidak bisa gunakan indeks.
Silakan lihat ini untuk detail lebih lanjut:
- http://use-the- index-luke.com/sql/where-clause/obfuscation/numeric-strings
- http://use- the-index-luke.com/sql/where-clause/functions/case-insensitive-search