Điểm cốt yếu là chỉ mục không thể được sử dụng nếu cơ sở dữ liệu phải thực hiện chuyển đổi ở phía bảng của phép so sánh.
Bên cạnh đó, DB luôn che giấu Chuỗi -> Số vì đây là cách xác định (nếu không, 1 có thể được chuyển đổi thành '01', '001' như đã đề cập trong các nhận xét).
Vì vậy, nếu chúng ta so sánh hai trường hợp có vẻ khiến bạn nhầm lẫn:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DB chuyển đổi chuỗi '1' thành số 1 và sau đó thực hiện truy vấn. Cuối cùng, nó có int ở cả hai bên để nó có thể sử dụng chỉ mục.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Một lần nữa, nó chuyển đổi chuỗi thành số. Tuy nhiên, lần này nó phải chuyển đổi dữ liệu được lưu trữ trong bảng. Trên thực tế, bạn đang thực hiện một tìm kiếm như cast(str_column as int) = 1
. Điều đó có nghĩa là, bạn không tìm kiếm trên dữ liệu được lập chỉ mục nữa, DB không thể sử dụng chỉ mục.
Vui lòng xem phần này để biết thêm chi tiết:
- 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