SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.05.2009 15:58:41

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Использование MEMORY TABLE большое количество обращений.

Нужно мнение специалистов.

Задача следующая:

Аппликация ответственная за подсчёт показов банеров.
Тоесть нужно подсчитывать сколько раз показался какой баннер.
Количество обращений около 10 000 в секунду.

Нужна статистика на каждый баннер на каждый день.

Делаю следующие:

1)При каждом показе баннера, обращение к php, insert в таблицу MEMORY (Mysql)

insert into banner_views_memory (banner_id) values ($banner_id)


2) Раз в 5 минут данные складываются и переносятся в постояную таблицу banner_stats. А затем таблица очищается.
Урезаный код:

   DECLARE c1 CURSOR FOR select banner_id,count(banner_id) from banner_views_memory group by banner_id;

cursor_loop:LOOP

     update banner_stats set views=views+l_views where banner_id=l_banner_id and date=CURRENT_DATE();
 
END LOOP cursor_loop;

truncate banner_views_memory;
 


Может можно что то оптимизировать ? Может есть более лучший способы ?

Отредактированно evgeny (04.05.2009 16:00:48)

Неактивен

 

#2 04.05.2009 22:21:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Использование MEMORY TABLE большое количество обращений.

Боюсь себе представить PHP работающий на 10к RPS. Более лучший способ — шардировать базу так же,
как вы шардировали морды (не верю в 10к с одной морды). Если у Вас 100к видов баннеров, храните
первые 25к на одной машинке, вторые 25к на другой и т.д.

Горизонтальное масштабирование рулит wink

Хотя конкретно для этой задачи я бы написал какой-нибудь простенький сервантик, который хранил
бы данные в виде простых файликов на диске (естественно, с кэшированием). Десятикратная
производительность при уменьшении ресурсов машины.

UPD: и после этого я почитал код wink

LOCK TABLES banner_stats WRITE, banner_views_memory WRITE;
UPDATE banner_stats d, banner_views_memory m SET d.views=d.views+m.views WHERE d.banner_id = m.banner_id;
TRUNCATE banner_views_memory;
UNLOCK TABLES;

Неактивен

 

#3 05.05.2009 15:50:15

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Использование MEMORY TABLE большое количество обращений.

Прошу прощения я сильно ошибся с нагрузкой ...
Нагрузка не 10 000 а около 250-500 в секунду :-)
Что значительно меняет ситуацию :-)

А вот это конечно , отличное сокращение курсора...


LOCK TABLES banner_stats WRITE, banner_views_memory WRITE;
UPDATE banner_stats d, banner_views_memory m SET d.views=d.views+m.views WHERE d.banner_id = m.banner_id;
TRUNCATE banner_views_memory;
UNLOCK TABLES;

Спасибо ! :-)

Неактивен

 

#4 05.05.2009 16:11:12

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Использование MEMORY TABLE большое количество обращений.

paulus написал:

Боюсь себе представить PHP работающий на 10к RPS. Более лучший способ — шардировать базу так же,
как вы шардировали морды (не верю в 10к с одной морды). Если у Вас 100к видов баннеров, храните
первые 25к на одной машинке, вторые 25к на другой и т.д.

Горизонтальное масштабирование рулит wink

Хотя конкретно для этой задачи я бы написал какой-нибудь простенький сервантик, который хранил
бы данные в виде простых файликов на диске (естественно, с кэшированием). Десятикратная
производительность при уменьшении ресурсов машины.

UPD: и после этого я почитал код wink

LOCK TABLES banner_stats WRITE, banner_views_memory WRITE;
UPDATE banner_stats d, banner_views_memory m SET d.views=d.views+m.views WHERE d.banner_id = m.banner_id;
TRUNCATE banner_views_memory;
UNLOCK TABLES;

Насчёт переноса данных с banner_views_memory в banner_stats то чо вы написали по моему отличный вариант.

Что насчёт начальных инсертов в  banner_views_memory.
Я при каждом обращении делаю INSERT INTO banner_views_memory (banner_id) VALUES ($banner_id) , таблица по бешеному растет ...
Мне предложили - складывать результаты сразу на лету в memory table, делать UPDATE  спомощию INSERT INTO ... ON DUPLICATE KEY UPDATE views=views+1

Лучший ли этот вариант ?
В моем случае при каждом обращении просто добавляется запись без всяких проверок.
Во втором предложении идет поиск по id, закрывается запись, производится запись.

Что скажите ?

Неактивен

 

#5 05.05.2009 16:55:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Использование MEMORY TABLE большое количество обращений.

Поиск по ключу — достаточно быстрая операция. ON DUPLICATE KEY сделан именно для
таких ситуаций.

Неактивен

 

#6 02.07.2010 10:10:54

vlady
Участник
Зарегистрирован: 02.07.2010
Сообщений: 2

Re: Использование MEMORY TABLE большое количество обращений.

Добрый день. У меня вопрос.

Почему эффективней хранить записи в виде небольших файлов?

Неужели PHP будет эффективней копаться в груде маленьких файлов с через запятую перечисленными значениями вида количество показов, количество кликов, реферер пользователя и т.д., а также подбирать необходимые к показу баннеры? Разве MySQL не для этого придумали? neutral

Неактивен

 

#7 02.07.2010 11:03:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Использование MEMORY TABLE большое количество обращений.

А в чем вопрос то? Маленькие таблички работают быстрее больших, т.к. индексы
более короткие. А про файлы, вроде, никто ничего не говорил.

Неактивен

 

#8 03.07.2010 02:26:15

vlady
Участник
Зарегистрирован: 02.07.2010
Сообщений: 2

Re: Использование MEMORY TABLE большое количество обращений.

Аааа, понятно, я просто прочитал, что данные хранить надо виде простых файлов на диске с кэшированием. Просто интересует похожая задача (много запросов каждую минуту от разных хостов единовременно, для учета необходима статистика показов), поэтому я спрашиваю. Искал информацию в Интернете, но не нашел, вышел на этот форум, может посоветуете как изначально правильно строить систему?

Неактивен

 

#9 05.07.2010 13:09:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Использование MEMORY TABLE большое количество обращений.

Преждевременная оптимизация — корень зла. Напишите систему так, как
кажется Вам разумным. Если производительность будет неудовлетворитель-
ная, попрофилируйте, найдите узкое место и оптимизируйте его.

Неактивен

 

#10 07.07.2010 14:06:07

Lemegeton
Участник
Зарегистрирован: 07.07.2010
Сообщений: 1

Re: Использование MEMORY TABLE большое количество обращений.

Наверное, поздно уже, но да внесу свои пять копеек.

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

Общая идея:
Использовать генератор рандома, возвращающий равномерно распределенные значения.

Например, с точностью до десяти показов:
IF FLOOR(RAND()*10)+1 = 10 THEN
     UPDATE banner_stats d SET d.views=d.views+10 WHERE d.banner_id = m.banner_id;
END IF

Решение позволяет резко сбросить нагрузку на СУБД ценой точности.

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

Неактивен

 

#11 16.07.2010 16:22:22

albachac
Участник
Откуда: Казань
Зарегистрирован: 16.07.2010
Сообщений: 1

Re: Использование MEMORY TABLE большое количество обращений.

Спасибо, очень помогла инфа эта.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson