Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как правильно хранить и сравнивать?


Автор: Рейкин 20.12.2005, 18:47
Здравствуйте,

Надеюсь поможете добрым советом smile

Создаю базу (таблицу в MySQL) c IP-адресами. Если IP новый, то записывается. Если такой уже есть, то не записывает. Раз в сутки таблица опустошается и всё сначала.

Вопрос: как организовать алгоритм, чтобы не очень тормозил? В идеале IP-шек может быть до 12000 (географический таргетинг)

Спасибо.

Автор: Dave 20.12.2005, 19:02
а нынешний алгоритм сильно тормозит ?
У тебя айпишники приходят раз в сутки все в месте или постепенно ?

Автор: Bose 20.12.2005, 19:21
обычно ip адреса хранят в виде long integer.

Автор: Bi0 20.12.2005, 19:34
Цитата(Bose @ 20.12.2005, 19:21)
обычно ip адреса хранят в виде long integer.

а как же точки ? smile Или я чего-то недопонимаю smile

Автор: Mal Hack 20.12.2005, 21:03
Цитата(Bi0 @ 20.12.2005, 19:34)
а как же точки ? smile Или я чего-то недопонимаю smile

Переводим IP в число и не паримся smile ip2long(); на что? smile

Автор: Рейкин 20.12.2005, 22:46
Цитата(Mal @ 20.12.2005, 21:03)
Переводим IP в число и не паримся smile ip2long(); на что? smile

Счас гляну что такое - похоже на классную вещь smile

Цитата(Dave @ 20.12.2005, 19:02)
а нынешний алгоритм сильно тормозит ?
У тебя айпишники приходят раз в сутки все в месте или постепенно ?

Я сначала за советом - ещё не писАл.
Будут приходить не сразу, не скопом.


А как хранить в базе? Построчно?
ID IP
1 1.1.1.1
2. 1.3.4.2
........

Или есть более быстрый способ для последующего чтения и сравнения?

Спасибо

Автор: Mal Hack 20.12.2005, 23:01
При чем тут построчно?
Хранить как число.

Автор: Gold Dragon 21.12.2005, 08:53
Цитата(Mal @ 20.12.2005, 23:01)
Хранить как число.

Если честно, не понял как числом хранить... Допустим есть адреса 195.122.193.5 и 195.122.19.35. Ну и как определить тогда какой из них какой если число получится 1951221935?

Автор: Рейкин 21.12.2005, 09:41
Цитата(Mal @ 20.12.2005, 23:01)
При чем тут построчно?
Хранить как число.

Я имею ввиду - как хранить в базе как число? Добавлять каждый раз строку в таблицу, задавая каждому числу два поля: само число и его ID. ID для того, чтобы перечитывать от и до при сравнении, конечно.


Цитата(Red @ 21.12.2005, 08:53)
Если честно, не понял как числом хранить... Допустим есть адреса 195.122.193.5 и 195.122.19.35. Ну и как определить тогда какой из них какой если число получится 1951221935?

Кажись там вообще не в такой. Пример:
ip2long("125.125.125.125") = 2105376125
А бывает вообще отрицательный (для других IP, конечно)...

Автор: Хоббит 21.12.2005, 10:23
.... да .. наверно люди сильно не знают информатику. .... есть такое понятие системы счисления .... вот ip адресс можно сказать записан в 255 ричной системе счисления .. а тебе надо перевести в 10 (нашу) систему. Сделать это можно так
ip = a.b.c.d = a * 255^3 + b * 255^2 + с * 255 + d // где ^ степень.
Обратный алгоритм примерно идиентичный, только надо будет делить на 255 и брать остатки.
( в принципе тебе это нафик не надо, т.к. есть стандартные функции перевода.
P.S. Отрицательные числа появляются из-за формата записи отрицательных чисел, т.к. для как в битном представлении у целых чисел 1 бит означает знак 0 плюс 1 минус, остальные означают число (причем у отрицательных чисел еще все биты инвертированы) Но это тоже не надо.
На счет хранения посторочно ??? .. не понятно ... просто для каждого IP новая строка в БД и все!

Автор: Рейкин 21.12.2005, 13:05
Хоббит - оппа, всё ясно объяснил, спасибо. Насчёт хранения - это и говорю.

Вопрос. Раз в сутки хочу стирать базу IP, начиная с нуля. Собираюсь просто удалять таблицу и создавать её заново. Это корректный подход?

Автор: R.M. 22.12.2005, 01:29
Рейкин
Цитата
Собираюсь просто удалять таблицу и создавать её заново. Это корректный подход?

Нет, можно её отчищать, непомню команду мускула, загляни в phpmyadmin или в учебник

Автор: mr.fox 22.12.2005, 03:05
Рейкин truncate `table`

Автор: Gold Dragon 22.12.2005, 08:54
а случайно не так?
Код

TRUNCATE TABLE table_name

Автор: R.M. 22.12.2005, 09:32
Red Dragon
Цитата(Red @ 22.12.2005, 09:54)
а случайно не так?

именно так

Автор: -=Ustas=- 22.12.2005, 10:22
TRUNCATE был включен в мускул с версии 3.23.28, если версия ниже, то делать DELETE FROM table.

Автор: Gold Dragon 22.12.2005, 11:29
На сколько я правильно понял документацию, то очень настоятельно рекомендуют использовать TRUNCATE т.к. DELETE очень тормозит

Автор: -=Ustas=- 22.12.2005, 11:41
Цитата(Red @ 22.12.2005, 11:29)
.к. DELETE очень тормозит

Не сказать что "очень", но TRUNCATE выполняется быстрее, т.к. она таблицу очищает одним "пучком", а не построчно ;)

Автор: Рейкин 22.12.2005, 14:29
Red Dragon - спасибо.
Да и спасибо всем, кто помог

Автор: Gold Dragon 22.12.2005, 15:58
Рейкин
Да я особо и не помог smile

Автор: -=Ustas=- 22.12.2005, 16:13
[offtop P.S. Извиняюсь за флейм]

Red Dragon, не скромничай! smile

[/offtop]

Автор: G0rinich 18.9.2006, 14:35
Как я понял, то повторно вносить запись в БД не следует.
Чтобы не выполнять к БД запрос на наличие записи, можно в таблице создать индекс типа UNIQUE по заданному полю. Тогда при попытке вставить запись, которая уже есть, БД вернет ошибку, иначе запрос выполнится нормально. Вот эту ошибку и надо отлавливать. Таким образом можно сократить кол-во запросов в 2 раза. В качестве альтернативы можно использовать запрос REPLACE. Работает аналогично UPDATE, только если заданной строки нет, он ее добавляет.

Автор: ewolf 18.9.2006, 20:56
Цитата(Хоббит @  21.12.2005,  10:23 Найти цитируемый пост)
т ip адресс можно сказать записан в 255 ричной системе счисления .. а тебе надо перевести в 10 (нашу) систему. Сделать это можно так ip = a.b.c.d = a * 255^3 + b * 255^2 + с * 255 + d  // где ^ степень.Обратный алгоритм примерно идиентичный, только надо будет делить на 255 и брать остатки.


Это немного оффтоп, но в число ip переводится не так, а например по такому алгоритму

Код

$a = explode('.', $ip);
$num = ($a[0] << (8*3)) + ($a[1] << (8*2)) + ($a[2] << (8*1)) + ($a[3]);


Здесь $num - числовое представление ip.

Т.е. секции ip адреса записываются в виде байт четырехбайтного числа (тотже принцип, что и при записи цвета RGB в файлах)

Автор: anka 19.10.2006, 08:48
А ты храни их не в Базе а в Текставом файле  smile 

Автор: Хоббит 19.10.2006, 10:53
я дал теорию... а уж как ты будешь действовать при переводе... деление на 255 или операциями сдвига.. это уже дело каждого

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)