Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

В каком типе данных хранить ip адреса пользователей в SQL MySQL?

#mysql #sql #хранение_данных


В каком типе данных хранить ip адреса пользователей в SQL MySQL ?
    


Ответы

Ответ 1



Адреса 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 добавлены функции для работы с ним

Ответ 2



мы храним в varchar, в принципе зачем что-то выдумывать для хранения айпишника? можно конешно хранить как целые числа и использовать функции mysql INET_ATON() и INET_NTOA(). детальнее вот тут http://expange.ru/e/%D0%9A%D0%B0%D0%BA_%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C_IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81_(MySQL)

Ответ 3



4 поля byte для IPv4 И места меньше занимает и оперировать проще

Комментариев нет:

Отправить комментарий