В SQL-запросах с объединением скорость медленная, возможно, проблема в индексах - PullRequest
0 голосов
/ 23 ноября 2010

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

Есть две таблицы: пользовательская таблица (около 5000 записей) и своего рода таблица истории (около 150 000 записей), в которой есть два столбца: дата и статус на эту дату.

Запрос является выбором, который находит пользователей, у которых нет записи истории на определенную дату.

В данный момент я пытаюсь сделать следующее:следующим образом:

select 
  u.user_id 
from 
  users u 
  left join history h on u.id= h.user_id and date = '20101116' 
where 
  date IS NULL;

Как это работает, я присоединяюсь к дате 20101116 (в формате ГГГГММДД), и если значение этой объединенной таблицы равно null, я знаю, что у меня нетзапись истории на данную дату.Это работает, но невероятно медленно, мне интересно, есть ли более быстрый / умный способ сделать это.

Мои таблицы, таким образом:

пользователи

+------+-----------------+
|  id  |  email_address  |
+------+-----------------+

history

+------+-----------+--------+----------+
|  id  |  user_id  |  date  |  status  |
+------+-----------+--------+----------+

У меня есть индексы только для столбцов ID обеих таблиц.

Ответы [ 4 ]

4 голосов
/ 23 ноября 2010

Запрос - это выборка, которая находит пользователей, у которых нет записи истории на данную дату.

select u.user_id 
from users,  history h
where u.user_id = h.user_id 
and not exists ( select 1 
                 from history 
                 where h.user_id = u.user_id 
                 and h.date = '20101116' )
1 голос
/ 23 ноября 2010
select u.user_id 
from users u 
where u.user_id not in (select h.user_id from history h where h.date = '20101116');
1 голос
/ 23 ноября 2010

Нет причины, по которой дата WHERE является нулевой, поскольку вы уже присоединились к определенной дате. Для меня это просто не имеет смысла. Если вы не говорите о двух разных полях даты, но не назвали их или не дали им псевдоним в своем примере?

По такому запросу не так много с точки зрения оптимизации. Лучшее, что вы можете сделать, это создать индекс для user_id и, возможно, для даты.

0 голосов
/ 01 марта 2015

Чтобы сделать ваш запрос быстрее, вам нужно добавить два индекса в таблицу history:

  • Индекс на history.user_id
  • Индекс на history.date

Попробуйте создать их и повторите запросы.Вы должны увидеть значительно улучшенную производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...