Миллионы запросов к скрипту в сутки (нужно работать с MySQL)

GrayMaster

Новичок
Миллионы запросов к скрипту в сутки (нужно работать с MySQL)

Добрый день !
Задачка по оптимизации ;)
Есть скрипт, на него льётся очень много траффика (речь идёт о миллионах запросов в сутки). Каждый запрос нужно записывать в базу (плюсовать счётчик в статистике, и записывать ещё кое-какую информацию).
Всё это проделывать в рил-тайме - думаю не очень хорошая идея ;) Видел что такие вещи делают с задержкой, например обновления базы происходит каждые 15 минут... Но как это реализовать ? Куда записывать информацию, в файлы чтоли ? :confused:
 

Asafchik

Новичок
Думаю, что через крон.
Используя систему счётчика.
Тоесть например сначала первые 5 записей, потом ещё 5.
Счётчик хранить в файле и считывать при обновлении.
Потом, когда записи кончатся обнулить счётчик и по новой.
 

GrayMaster

Новичок
Ну это понятно что использую крон делать обновления в базе. Но куда набирать информацию ?? В файлы чтоли ?
И чем почему лучше делать задержки ? Ведь по сути одни и теже запросы будут :-| или как-то подругому это организовывается !?
 

Asafchik

Новичок
Ну я понимаю это так:
Каждый N минут, N записей заносятся в базу.
Типа как
строка1
2
3
4
5
Читаем первые 5.
в файл в id ставим 5.
Записываем.
В след раз читаем6
7
8
9
10
Прямая запись в БД.Нафиг тут файлы?
 

alexhemp

Новичок
Asafchik

Ты хоть вопрос прочитай, прежде чем что-то предлагать.

GrayMaster
В принципе тут оптимизировать нечего, тут нужно менять принцип. У тебя на каждый запуск скрипта оверхед на коннект и компиляцию запросов ну и плюс большое число самих запросов.

Я бы поэкспериментировал вот с чем

1. Писать логи в файлы, затем обрабатывать их по крону и хранить в базе уже обобщенную статистику.

2. Писать логи в memcached, далее обрабатывать про крону - аналогично файлам.

А вообще для счетчиков достаточно правильно настроить апачевские логи (читай про CustomLog) и соотв. парсить их уже. Запрашивать какую-нить картинку, без всяких скриптов, а еще лучше nginx поставить для такой нагрузки и на поддомен его.
 

clops

Новичок
фишка в том, что когда заливаешь много записей за раз (одним INSERT запросом) то индексы перестраиваются тоже только один раз, а не каждый раз после INSERT

полагаю что есть какая-то «переходная» таблица MyISAM куда всё пихается быстро и без претензий с помощью INSERT DELAYED а она уже очищается кроном раз в, скажем, 5 минут
 

vadim

Guest
GrayMaster
Здесь можно много чего придумывать и уже придумано. У многих крупных компаний далеко не один сервер. Можно себе вполне представить, что один сервер, оптимизированный под инсерты, хранит какую-то текущую информацию. И раз в 15 минут инфа с этого сервера переписывается на другой, где она уже хранится в агрегированном виде (то есть в нужном нам). Таких архитектур можно много придумать. Под сервером я имел базу данных.

В общем, с одним сервером уже описал alexhemp.

Если запросы одинаковы, то можно ещё использовать Prepared Statements, если база это позволяет.
 

GrayMaster

Новичок
2vadim: пока обойдусь одним сервером, а дальше будет видно...
Всем большое спасибо ! Пойду искать документации...
 

Falc

Новичок
alexhemp правильно написал, не нужно каждый раз к базе конектится, оверхед слишком большой. Рекомендую присмотрется к его пункту 2, особенно к части про nginx. Пишешь логи в нужном формате на какую-нибудь статичную картинку, а потом по крону парсишь их и кладешь в базу, а еще лучше пишешь логи в таком формате, чтобы сразу загрузить в базу через LOAD DATA INFILE.
 

clops

Новичок
кстати да — load data infile (как сказано в доках) — в среднем в 20 раз быстрее INSERTа
 

GrayMaster

Новичок
nginx - отпадает.
парсить логи апача - тоже для данного случая неподходит.

Что лучше в данном случае ? использовать HEAP таблицы или "LOAD DATA INFILE" ?
Я пологаю что писать в базу всё-же лучше используя LOAD DATA INFILE.

фишка в том, что когда заливаешь много записей за раз (одним INSERT запросом) то индексы перестраиваются тоже только один раз, а не каждый раз после INSERT
Всмысле одним INSERT запросом - это так: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); ?
 

alexhemp

Новичок
nginx - отпадает.
парсить логи апача - тоже для данного случая неподходит.
Объясни что за статистику ты собираешь в миллионных количествах такую что ее нельзя брать из логов?

Вообще формат лога можно настроить весьма гибко.
 

GrayMaster

Новичок
Это важная статистика - это не просто счётчик. Фиксировать запросы должен именно скрипт.

Вобщем задача такая:
На серере зарегистрировано много пользователей, каждый из них шёлт траффик на сервер, неоходимо:
Записывать кол-во обращейний к серверу в сутки/час для каждого пользователя (для статистики).
----

Насколько я понял, через LOAD DATA INFILE можно сделать вставку в базу, а мне нужно делать UPDATE'ы в базе...
---

и ещё один вопрос: как организовать БД для сбора такой информации ? т.е. статистика по дням и часам для каждого из пользователей...

Мои предположения:
пишем в какой-либо файл данные о запросах:
пользовать|время|др. информация

Каждые 15 минут открываем окрываем этот файл и переносим в базу следующим образом:
для каждого пользователя добавляем текущий час в таблицу hours если данного часа там нет.
insert into `hours` set `hour`=8 where `mid`='user_id' and `date`='2006-04-26';
Затем делаем множество UPDATE'ов, например:
update `hous` set `count`=`count`+1 where `mid`='user_id' and `hour`='8' and `date`='2006-04-26';
тут можно плюсовать не 1, а сначала собрать все запросы этого пользователя за этот час, и плюсануть на это кол-во запросов.

Правильно рассуждаю, или подправите ?
 

vadim

Guest
Я для ведения логов (в том числе и доступ) ввёл понятие "событие", то есть когда чтото происходит, что я хочу сохранить. У каждого события есть параметры, например у события "ЮзерВошёлВСистему" есть параметр ID_USER. Есть надо вывести статистику по конкретному юзеру, то тогда я считаю статистику.
Но никаких Апдейтов у меня не происходит (то есть в таблице с юзерами нет поля, которое обозначало бы количество заходов на страницу), только инсерты новых событий.
 

GrayMaster

Новичок
2vadim: в день 10.000.000 событий ? :)
Тут нужна таблица "hours", чтоб сразу было видно сколько запросов в час наконкретного пользователя и в общем.
 

vadim

Guest
GrayMaster
А что у вас за система, которая пишет столько событий в день?? Прост так интересно.

А если вам позже другая информация понадобится, типа самые загруженные минуты??

Если вы поддерживаете такую систему, то и сервера должны быть мощными. Хранение такого количества записей само по себе не проблема. Таблица с "событиями" можно рассматривать как этот самый временный лог. И из него уже формировать hours
 

GrayMaster

Новичок
2vadim: почитай топик. необдуманые предложения пишешь :)
А если вам позже другая информация понадобится, типа самые загруженные минуты??
Нет, минуты не понадобятся...
А что у вас за система, которая пишет столько событий в день?? Прост так интересно.
Скрипт пропускает через себя очень много траффика.
Если вы поддерживаете такую систему, то и сервера должны быть мощными.
Сервера и так мощные :)

-----

Повторюсь:

Это важная статистика - это не просто счётчик. Фиксировать запросы должен именно скрипт.

Вобщем задача такая:
На серере зарегистрировано много пользователей, каждый из них шёлт траффик на сервер, неоходимо:
Записывать кол-во обращейний к серверу в сутки/час для каждого пользователя (для статистики).
----

Насколько я понял, через LOAD DATA INFILE можно сделать вставку в базу, а мне нужно делать UPDATE'ы в базе...
---

и ещё один вопрос: как организовать БД для сбора такой информации ? т.е. статистика по дням и часам для каждого из пользователей...

Мои предположения:
пишем в какой-либо файл данные о запросах:
пользовать|время|др. информация

Каждые 15 минут открываем окрываем этот файл и переносим в базу следующим образом:
для каждого пользователя добавляем текущий час в таблицу hours если данного часа там нет.
insert into `hours` set `hour`=8 where `mid`='user_id' and `date`='2006-04-26';
Затем делаем множество UPDATE'ов, например:
update `hous` set `count`=`count`+1 where `mid`='user_id' and `hour`='8' and `date`='2006-04-26';
тут можно плюсовать не 1, а сначала собрать все запросы этого пользователя за этот час, и плюсануть на это кол-во запросов.

Правильно рассуждаю, или подправите ?

-~{}~ 28.04.06 03:25:

Хм... писать в файл, или в таблицу в памяти :confused:
 
Сверху