В каком типе данных хранить ip адреса пользователей в SQL MySQL ?
Ответ
Адреса IPv4 храню в поле int unsigned в виде числа. Unsigned обязательно, чтобы на один знак больше влазил.
На жёстком диске занимает 4 байта. Что меньше чем char/varchar.
Для преобразования из строкового ip-адреса в число есть mysql функция INET_ATON
mysql> SELECT INET_ATON('193.125.99.10');
+----------------------------+
| INET_ATON('193.125.99.10') |
+----------------------------+
| 3246220042 |
+----------------------------+
1 row in set (0.00 sec)
Для преобразования из числа в адрес - INET_NTOA
Int вмещает до 2147483647
Int unsigned - до 4294967295
Выборки по диапазонам делать удобно. Источник мой :)
Хранить данные по ip в varchar - моветон, пригодный только для маленьких проектов. Если у вас миллион посетителей в день, из базы надо выжимать максимальную производительность, а памяти нужно использовать как можно меньше. Поскольку память - это деньги, циклы процессора - это деньги.
Миллион посетителей в день вполне может быть если вы делаете не магазинчик, а, допустим, рекламную сеточку, dsp, баннерокрутилку, платежную систему (свою или для банка) и т.д.
Миллион посетителей в день - это например, ваш выстреливший стартапчик, развернутый на AWS, лишняя сотня(тысяча?) баксов в месяц, которую вам может сэкономить такая оптимизация никогда не повредит.
Использование INET_NTOA/INET_ATON очень легкая, но важная оптимизация.
Когда вам потребуется обратиться к БД за айпишником, лучше делать преобразования inet_ntoa/inet_aton до запроса, в php/python/на_чем_вы_там_пишете чтобы использовались индексы бд.
P.S. про IPV6 - https://dba.stackexchange.com/a/81402 в версии 5.6 MySQL добавлены функции для работы с ним
Комментариев нет:
Отправить комментарий