Cho rằng bạn đã có chỉ mục trên ip_start
, đây là cách sử dụng nó tốt nhất, giả sử rằng bạn muốn thực hiện một quyền truy cập cho mỗi IP (1234
trong ví dụ này):
select organization from (
select ip_end, organization
from iptable
where ip_start <= 1234
order by ip_start desc
limit 1
) subqry where 1234 <= ip_end
Thao tác này sẽ sử dụng chỉ mục của bạn để bắt đầu quét. Quá trình này sẽ dừng ngay lập tức do limit 1
. Chi phí chỉ nên cao hơn một chút so với chi phí của một truy cập được lập chỉ mục đơn giản. Tất nhiên, kỹ thuật này dựa trên thực tế là các phạm vi được xác định bởi ip_start
và ip_end
không bao giờ chồng chéo.
Vấn đề với cách tiếp cận ban đầu của bạn là mysql, không biết về ràng buộc này, chỉ có thể sử dụng chỉ mục để xác định nơi bắt đầu hoặc dừng quá trình quét (nó nghĩ) nó cần để tìm tất cả các kết quả phù hợp cho truy vấn của bạn.