Преобразуйте нижний ip и верхний ip в диапазоне в целые числа и сохраните диапазон в БД, затем убедитесь, что оба столбца проиндексированы.
С макушки головы (псевдокод):
function ipmap(w,x,y,z) {
return 16777216*w + 65536*x + 256*y + z;
}
var masks = array[ipmap(128,0,0,0), ipmap(196,0,0,0), ..., ipmap(255,255,255,255)]
function lowrange(w, x, y, z, rangelength) {
return ipmap(w, x, y, z) & masks[rangelength]
}
function hirange(w, x, y, z, rangelength) {
return lowrange(w, x, y, z, ,rangelength) + ipmap(255,255,255,255) - masks[rangelength];
}
Это должно сделать это.
Чтобы определить, попадает ли конкретный ip в какой-либо из диапазонов, преобразуйте его в целое число и выполните:
SELECT COUNT(*) FROM ipranges WHERE lowrange <= 1234567 AND 1234567 <= highrange
Оптимизатор запросов должен иметь возможность значительно ускорить это.