вы не можете просто хранить IP-адреса в качестве VARCHAR. Ну ... вы можете, но это неправильно на чем-то фундаментальном уровне.
Правильное решение заключается в том, чтобы хранить IP-адреса в том виде, в каком они фактически представляют: 32-разрядные целые числа без знака (INT UNSIGNED
).
Преобразование данных при импорте, используя INET_ATON()
built-in function, который преобразует адрес IPv4 с точками в целое число без знака.
запроса данных с использованием обратной функции:
WHERE INET_NTOA('you.r.ip.add') BETWEEN begin_ip_num AND end_ip_num;
вы получите более performanace если вы индексировать начала и конца колонны в обоих направлениях, например:
PRIMARY KEY(begin_ip_num,end_ip_num),
KEY(end_ip_num,begin_ip_num)
Однако ... B -Это не подходит для такого поиска.
Вы также сможете запросить его еще быстрее, если вы используете spatial index, как Jeremy Cole explains in a blog post on the topic. Обратите внимание, что он также подробно рассказывает об использовании INET_ATON()
и INET_NTOA()
.
Концепция пространственного индекса взрывает умы некоторых людей, так как они предполагают, что «пространственными» означает лишь «гео пространственного», но IP-адрес пространство, в конце концов, все еще «пространство» и R-Tree индексов при условии пространственных расширений MySQL, гораздо более оптимальны, чем B-деревья для поиска границ «пространства», которые занимает вещь (например, IP-адрес).
Спасибо за ответ! низкое знание MySQL. Поэтому, прежде чем я создал таблицу в phpmyadmin и загрузил CSV-файл с помощью инструмента импорта. Но когда вам нужно использовать встроенные функции, вы должны правильно создать сценарий импорта? С чего начать? – Robbert
You может начать с уже имеющейся таблицы. Создайте новую таблицу с нужной структурой и столбцами в той же позиции, а затем используйте 'INSERT ... SELECT' t o копировать из таблицы в таблицу с преобразованием: 'INSERT INTO table2 SELECT INET_ATON (begin_ip_num), INET_ATON (end_ip_num), долгота, ... FROM table1;'. https://dev.mysql.com/doc/refman/5.6/en/insert-select.html –
Да, это сработало. Большое спасибо! – Robbert