У меня есть база данных, которая связывает диапазоны IP-адресов с идентификатором местоположения в другой таблице. Он такой большой, что мы пытаемся найти новое решение с помощью aerospike.
Решение, которое мы придумали, состоит в том, чтобы использовать интервалы. Что-то вроде этого:
Ключ: 1000000 (int64 IP-адреса) Bin1: по умолчанию: 1 (идентификатор местоположения для начала данного блока)
Bin2: 1234567:2 (первый IP-адрес в блоке, где изменяется идентификатор местоположения): (идентификатор местоположения)
Bin3: 1345678:3 (второй IP-адрес в блоке, где изменяется идентификатор местоположения): (идентификатор местоположения)
так далее
Используя этот метод, мы могли бы математически получить идентификатор местоположения из IP-адреса, сократив при этом количество строк и время обработки сервером.
Я хочу провести несколько тестов на моей идее, но у меня возникла проблема с преобразованием нашей текущей системы.
У нас есть база данных с диапазонами (например, 0-160000) со связанным идентификатором местоположения.
Таблица диапазонов имеет 9 297 631 строку.
Скрипт С#, который я сделал, выполняет этот sql:
SELECT * FROM dbo.GeoIPRanges
where (startIpNum BETWEEN 300000000 AND 300000100)
OR (endIpNum BETWEEN 300000000 AND 300000100)
OR (startIpNum <= 300000000 AND endIpNum >= 300000100)
Это занимает около 4 секунд на звонок. Приведенные выше цифры являются примерными. Вы можете видеть, что они находятся в блоках по 100. Максимальное количество IP-адресов составляет 4 294 967 295. Делая это блоками по 100, я получаю 42 949 672 вызова примерно по 4 секунды каждый. что занимает очень много времени. Время обработки, необходимое для форматирования информации в форме, которую я хочу для aerospike, незначительно.
Зная всю эту информацию, есть ли идеи, как это ускорить.