Giả sử hiệu suất tối đa là mục tiêu, tôi nên chọn SUBSTR(my_field,1,6)
và tạo chỉ mục dựa trên chức năng để hỗ trợ truy vấn.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Như những người khác đã chỉ ra, SUBSTR(my_field,1,6)
sẽ không thể sử dụng chỉ mục thông thường trên MY_FIELD
. Phiên bản LIKE có thể sử dụng chỉ mục, nhưng ước tính bản số của trình tối ưu hóa trong trường hợp đó nói chung là khá kém, vì vậy có nhiều khả năng không sử dụng chỉ mục khi nó hữu ích hoặc sử dụng chỉ mục khi quét bảng sẽ thích hợp hơn. Lập chỉ mục biểu thức thực tế sẽ cung cấp cho trình tối ưu hóa nhiều thông tin hơn để làm việc với nó, do đó, có nhiều khả năng chọn chỉ mục chính xác hơn. Ai đó thông minh hơn tôi có thể đề xuất cách sử dụng thống kê trên các cột ảo trong 11g để cung cấp cho trình tối ưu hóa thông tin tốt hơn cho truy vấn LIKE.
Nếu 6 là một biến (tức là đôi khi bạn muốn tìm kiếm 6 ký tự đầu tiên và đôi khi muốn tìm kiếm một số khác), có thể bạn sẽ không thể tìm ra chỉ mục dựa trên hàm để hỗ trợ truy vấn đó. Trong trường hợp đó, bạn có thể tốt hơn với những quyết định mơ hồ của trình tối ưu hóa với công thức LIKE.