2015-11-25 7 views
0

У меня есть приложение, которое имеет таблицу установки и таблицу использования.Как может быть более эффективный запрос, чем Left Outer Join

Я хочу, чтобы проверить информацию установки, и посмотреть, как многие из них до сих пор активны

select i.source,count(i.app_id),count(distinct u.app_id) from appinstall i 
left outer join appuse u 
on i.app_id = u.app_id 
where a.timestamp > '2015-01-01 00:00:00' 
and u.timestamp > (last 3 days) 
group by i.source 

Viola, я фактически убил мои RDS чтения реплики. Тайм-аут. Gameover

Таким образом, проблема заключается в том, что обе таблицы составляют около 1 миллиона строк. Вышеуказанные поля индексируются. Проблема заключается в том, что они различны, и их убивают.

Возможно ли сделать запрос FIRST перед соединением и использовать данные в этом? Если да - то, что называется? Или я столкнусь с этим. не используя SQL для этого, независимо от того, что будет убивать себя - лучше просто использовать веб-приложение или какой-либо другой двигатель для хранения данных, чтобы сообщить>

Примечание Innodb, MySQL 5.6

+0

Ваша ВНУТРЕННЯЯ СОЕДИНЕННОСТЬ отображается как ВХОДНАЯ ВСТУПЛЕНИЕ, поэтому, если вы счастливы, что результирующий набор так же, как вы ожидаете, тогда вы также можете написать его как INNER JOIN. Кроме того, индекс покрытия (app_id, timestamp) может оказаться более эффективным, но нам действительно нужно увидеть EXPLAIN для измененного запроса. – Strawberry

+0

Вы были правы - там, где все время вызывали проблему. Сочетание с вложенными выборками schadr позволило мне присоединиться к ним и иметь отдельные сегменты данных :) – Nick

+0

Я не думаю, что решение shadr будет более эффективным, чем индекс покрытия, но я могу ошибаться – Strawberry

ответ

1

Вы можете запустить ИНЕКЕ первой и сократите свои таблицы с помощью вложенных выборок.

SELECT i.source, COUNT(i.app_id), COUNT(distinct u.app_id) FROM 
(SELECT i.app_id, i.source FROM appinstall i where i.timestamp > '2015-01-01 00:00:00') AS i 
LEFT OUTER JOIN 
(SELECT u.app_id FROM appuse u WHERE u.timestamp > (last 3 days)) AS u 
ON i.app_id = u.app_id 
GROUP BY i.source 

Другой подход будет работать объяснить, чтобы увидеть, как MySQL планы выполнения запроса, чтобы увидеть, какие индексы он использует http://dev.mysql.com/doc/refman/5.7/en/using-explain.html.

Вы также можете попробовать внутреннее соединение и добавить отсутствующие поля с помощью объединения.

+0

Вложенные выборы сделали трюк. Я мог бы уменьшить количество объединений на миллионы строк. Благодаря! – Nick