PHP: правильный способ хранения IP в MySql и самый быстрый способ поиска IP по миллионам строк - PullRequest
3 голосов
/ 20 октября 2010

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

.. или я поступаю неправильно?

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

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

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

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

1 голос
/ 20 октября 2010

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

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

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

1 голос
/ 20 октября 2010

Я правильно делаю?И нужно ли использовать «unsigned»?

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

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

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

...