PHP:Правильный способ хранения IP-адреса в MySQL и самый быстрый способ поиска IP-адреса по миллионам строк
-
09-10-2019 - |
Вопрос
Я сохраняю IPv4-адреса в столбце типа "int unsigned" с inet_aton .[Я все делаю правильно?И необходимо ли использовать "без знака"?] Этот конкретный столбец также индексируется.Поскольку во всей таблице будут миллионы строк и несколько строк, содержащих один и тот же IP-адрес, какой способ поиска этих строк будет самым быстрым?
.. или я иду по этому пути неправильно?
Решение
Я делаю это правильно? И использует «без знаки» необходимым?
Да. Без unsigned
Более высокие IP-адреса не будут храниться должным образом и использование int
(вместо varchar
) хранит его наиболее эффективно.
Что будет самым быстрым способом поиска этих строк?
Что касается оптимизации поиска, это зависит от того, что все вы ищете (дополнительные таблицы и т. Д.). В целом, индексация колонки unsigned INT дает вам быструю производительность.
Другие советы
Использование inet_aton - правильный способ сделать это, поэтому вы не сохраняете дополнительную бессмысленную информацию (нет смысла сохранять значение, большее 256 для любых заданных 3 чисел).В результате получается 32-битное число, которое будет вписываться в unsigned int.
Индексация по столбцу int ускорит поиск по IP-адресу.Если ваша база данных станет ДЕЙСТВИТЕЛЬНО большой, вы начнете сталкиваться с проблемами масштабирования при хранении подобных вещей в MySQL.
Я предполагаю, что вы не собираетесь этого делать, но укажу, что хранение полной информации журнала для большого загруженного сайта в СУБД, как правило, считается плохой вещью (tm).Вам не нужны свойства реляционной целостности, гарантируемые базой данных, и вы записываете гораздо больше записей, чем читаете.Рассмотрите возможность использования nosql или добавления к плоским файлам вместо этого и при необходимости разбора ваших журналов с помощью специальной программы.
Да, это лучший способ хранить IP-адреса в MySQL.
Если вы посмотрите на документацию для Inet_aton. Вы можете увидеть, что рекомендуется использовать столбец unsigned int или любой IP-адрес с первым OCTED более 127 не будет храниться правильно.
Это также очень быстрый способ сделать поиск. MySQL обрабатывает целочисленные столбцы очень хорошо, и, индексируя этот столбец и используя INET_ATON в своем поиде, вы можете добиться очень быстрого запросов.