| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Как правильно хранить и сравнивать? |
| Автор: Рейкин 20.12.2005, 18:47 |
| Здравствуйте, Надеюсь поможете добрым советом Создаю базу (таблицу в 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 | ||
а как же точки ? |
| Автор: Mal Hack 20.12.2005, 21:03 | ||
Переводим IP в число и не паримся |
| Автор: Рейкин 20.12.2005, 22:46 | ||||
Счас гляну что такое - похоже на классную вещь
Я сначала за советом - ещё не писАл. Будут приходить не сразу, не скопом. А как хранить в базе? Построчно? 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 | ||
Если честно, не понял как числом хранить... Допустим есть адреса 195.122.193.5 и 195.122.19.35. Ну и как определить тогда какой из них какой если число получится 1951221935? |
| Автор: Рейкин 21.12.2005, 09:41 | ||||
Я имею ввиду - как хранить в базе как число? Добавлять каждый раз строку в таблицу, задавая каждому числу два поля: само число и его ID. ID для того, чтобы перечитывать от и до при сравнении, конечно.
Кажись там вообще не в такой. Пример: 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 | ||
а случайно не так?
|
| Автор: R.M. 22.12.2005, 09:32 | ||
Red Dragon
именно так |
| Автор: -=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 | ||
Не сказать что "очень", но TRUNCATE выполняется быстрее, т.к. она таблицу очищает одним "пучком", а не построчно ;) |
| Автор: Рейкин 22.12.2005, 14:29 |
| Red Dragon - спасибо. Да и спасибо всем, кто помог |
| Автор: Gold Dragon 22.12.2005, 15:58 |
| Рейкин Да я особо и не помог |
| Автор: -=Ustas=- 22.12.2005, 16:13 |
| [offtop P.S. Извиняюсь за флейм] Red Dragon, не скромничай! [/offtop] |
| Автор: G0rinich 18.9.2006, 14:35 |
| Как я понял, то повторно вносить запись в БД не следует. Чтобы не выполнять к БД запрос на наличие записи, можно в таблице создать индекс типа UNIQUE по заданному полю. Тогда при попытке вставить запись, которая уже есть, БД вернет ошибку, иначе запрос выполнится нормально. Вот эту ошибку и надо отлавливать. Таким образом можно сократить кол-во запросов в 2 раза. В качестве альтернативы можно использовать запрос REPLACE. Работает аналогично UPDATE, только если заданной строки нет, он ее добавляет. |
| Автор: anka 19.10.2006, 08:48 |
| А ты храни их не в Базе а в Текставом файле |
| Автор: Хоббит 19.10.2006, 10:53 |
| я дал теорию... а уж как ты будешь действовать при переводе... деление на 255 или операциями сдвига.. это уже дело каждого |