2013-07-09 3 views
-1

Я занимаюсь интернатурой в рекламной компании, я уже реализовал инструмент для сбора всей необходимой формы данных в facebook и импорта их в базу данных.выберите из нескольких таблиц и сумму против объединения и суммы

Теперь я пытаюсь манипулировать этими данными, сначала создав несколько тестовых примеров и получив некоторые результаты. Таблицы растут на 35 тыс. Строк в день, поэтому через месяц с использованием инструмента я заметил, что запрос, который я использую для получения суммы определенных кликов adcreatives, начинает замедляться.

Я спрашиваю, может ли запрос, который я использую, ускорить, если я использую его для соединения и как.

здесь запрос я есть на сумму кликов в adcreative (с adgroup_id, campaign_id, как подключаться к другим таблицам):

<!-- language-all: lang-sql --> 
SELECT t1.adgroup_id, t1.campaign_id, t1.creative_ids, SUM(t2.clicks) AS clicks 
FROM adgroups t1, adgroup_stats t2 
WHERE t1.adgroup_id = t2.adgroup_id 
GROUP BY t1.creative_ids 
ORDER BY clicks DESC 

В настоящее время запрос занимает 3 секунд, чтобы завершить на выделенном сервере, я думаю, что через 6 месяцев это будет продолжаться более 60 секунд или около того, когда таблицы будут расти.

редактировать: вот объяснить запроса (хотя это первый раз, когда я на самом деле использовать его и не уверен, что это значит)

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 671549 Using temporary; Using filesort 
1 SIMPLE t1 ref PRIMARY PRIMARY 8 fbads.t2.adgroup_id 358 Using index 
+0

** Прежде всего ** вам необходимо запустить свое соединение и посмотреть его производительность без каких-либо агрегаций. Вы использовали EXPLAIN свой запрос? Без объяснения не должен приниматься вопрос о производительности SQL. Только тогда, когда вы делаете свое соединение, работайте быстро - тогда вы можете пойти на агрегации –

ответ

0

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

Я бы вычислил агрегаты за предыдущие месяцы (дни и т. Д.) С заданием cron, а когда вам нужна статистика, то слейте это со свежими результатами (используя запрошенный вами запрос). Вот почему вам нужно только сканировать новую запись, а это значит, что запросы будут быстрыми.

В качестве альтернативы вы можете хранить обновленные счетчики в таблице adgroups и обновлять их при каждом нажатии. Не уверен, что если mysql является правильным инструментом для этого, я могу порекомендовать MongoDB, он может делать очень быстрые атомные приращения в полях, и хотя он не дает вам никаких строгих гарантий (ACID) в качестве реляционной базы данных, в этом случае это не проблема, клики объявлений не являются критически важными данными, никто не собирается жаловаться, если вы потеряете < 0.01% процентов информации о клике.

+0

да рассогласования звонят и будут происходить часто, и это ожидается; даже 5% может быть приемлемым, если источник несколько приколот. Ваш подход, похоже, имеет смысл, но ежедневная статистика должна оставаться вместе в этом чудовище по причинам, которые я не могу раскрывать. Тем не менее, я могу начать реализовывать что-то вроде этого, сохраняя данные, как меня изначально спрашивали. –