2010-10-20 4 views
3

Я сохраняю адреса IPv4 в столбце типа int без знака с помощью inet_aton. [Я делаю это правильно? И используется «unsigned» required?] Этот конкретный столбец также индексируется. Поскольку на всей таблице будет миллионы строк и несколько строк, содержащих один и тот же IP-адрес, что будет самым быстрым способом поиска этих строк?PHP: правильный способ хранения IP-адресов в MySql и быстрый поиск IP-адресов в миллионах строк

.. или я об этом ошибаюсь?

+0

У каждого был отличный ответ. Хотя Алан Гелейнс был первым, поэтому я надеюсь, что нет никаких трудностей! – Mickey

+0

На самом деле я был первым, а затем Пол Макмиллан, затем Алан. Алан просто оказался наверху, когда загрузил страницу (она рандомизирована, когда еще нет голосов). Но это круто. Алан получил хороший ответ и мог использовать некоторые моменты. – webbiedave

+0

Я знал это: D - Хорошо, еще раз спасибо всем. – Mickey

ответ

1

Я делаю это правильно? И используется «без знака»?

Да. Без unsigned более высокие IP-адреса не будут сохранены должным образом, и использование int (вместо varchar) сохраняет его наиболее эффективно.

какой будет самый быстрый способ поиска для этих строк?

Что касается оптимизации поиска, это зависит от того, что вы ищете (дополнительные таблицы и т. Д.). В целом, индексирование столбца unsigned int дает вам высокую производительность.

+0

спасибо за то, что вы вводите. – Mickey

2

Использование inet_aton - правильный способ сделать это, поэтому вы не храните лишнюю бессмысленную информацию (нет смысла хранить значение больше 256 для любых заданных 3 чисел). Это приводит к 32-битовому числу, которое будет вписываться в unsigned int.

Индексирование по столбцу int сделает поиск по IP-адресу быстрым. Если ваша база данных становится ДЕЙСТВИТЕЛЬНО большой, вы начнете запутывать проблемы масштабирования, сохраняя подобные вещи в MySQL.

Предполагаю, что вы этого не сделаете, но укажет, что сохранение полной информации о журнале для большого загруженного сайта в РСУБД обычно считается плохим (tm). Вам не нужны свойства реляционной целостности, гарантированные базой данных, и вы пишете больше записей, чем вы читаете. Рассмотрим nosql или добавьте вместо него плоские файлы и проанализируйте свои журналы, когда это необходимо, используя специальную программу.

+0

Масштабирование проблем? Ну .. сколько слишком много? Сколько строк у меня есть, прежде чем поиск IP-адреса займет больше секунды? – Mickey

+0

Это зависит полностью от вашего оборудования. –

1

Да, это лучший способ хранения IP-адресов в MySQL.

Если вы посмотрите на документацию для INET_ATON, вы можете увидеть, что рекомендуется использовать столбец UNSIGNED INT или любой IP-адрес с первым октановым числом 127, который не будет сохранен правильно.

Это также очень быстрый способ поиска. MySQL отлично обрабатывает целые столбцы, и, индексируя этот столбец и используя INET_ATON в вашем поиске, вы можете получить очень быстрые запросы.