Делаю Базу Данных IP адресов. Использоваться будет как справочник с возможностью добавления новых IP, удалению IP, поиску конкретного IP или подсети и самое главное выводу свободных IP адресов в конкретной подсети. Как сделать ввод данных, удаление и поиск конкретного IP или подсети знаю, а как осуществлять поиск свободного айпи в подсети?
Есть две мысли:
1)Забить весь диапазон в БД и потом сделать проверку по тому внесено ли имя, например.
2)Искать с помощью цикла. Этот вариант, наверное, лучше, но проблема с хранением данных. Если это будет текст, то я же не смогу сделать ему +1, а если INT или VARCHAR, то там некорректно данные выводятся. Как быть? Может у кого-то есть наработки в этой области?
При запросе создавать временную таблицу, заполнять её всеми адресами подсети, затем исключать имеющиеся из основной таблицы. Там битовые операции наложения маски на адрес, при индексе по адресу должно летать.
P.s. Адреса храните же как unsigned int? В mysql есть полезные функции INET_ATON() и INET_NTOA() для преобразования IPv4 адресов из текста в целое и наоборот.
Можно подробнее про временную таблицу? нашел синтаксис :
create table ip_tmp
(ip_tmp int)
insert into ip_tmp (ip) values(
while(i=192.168.0.1, i < 192.168.0.255, i++))
как-то так?
и как их потом сравнить?
Как-это обрезаются? IPv4 адрес — это 32 бита, ни больше, ни меньше. Сортировать, искать — идеально. Создать временную желательно в памяти, а не на диске – быстрее:
CREATE TEMPORARY TABLE subnet
(ip INT UNSIGNED, INDEX USING BTREE (ip))
ENGINE = MEMORY;
imho проще отсекать подсетки, например where f1=192 and f2=168 and f3=1 and f4 between 0 and 22 при таком запросе можно быстро отсечь лишнее, если есть составной ключ по четырем полям. и сканировать перебором только последнюю ветвь (f4) в узком диапазоне (255 строк максимум)