2016-03-28 5 views
1

У меня есть следующий запрос, возвращающий UserIds, которые не в таблице message_logзапросов с очень долгое время

select * from likes where userid not in(select to_id from message_log) 

у меня есть индекс на столбце идента в таблице Понравилось и индекс на столбце to_id в таблице message_log, но индекс не используется в соответствии с EXPLAIN. Что-то не так с моим запросом? Мой запрос работает в течение 20 минут и результатов пока нет.

+0

Возможно, у вас слишком много строк? Рассмотрите возможность использования 'join' – Ian

+0

Должен ли я использовать левое соединение или внутреннее соединение? – Arya

+0

Должно быть слева, потому что вы хотите включить все из 'нравится ', хотя он не существует в' message_log'. Но просто любопытно, сколько у вас строк? – Ian

ответ

2

Вы можете попробовать это

select * from likes lk where not exists (select 1 from message_log where to_id = lk.userid) 
+0

Первый ничего не возвращает, а второй один дает эту ошибку ОШИБКА: ошибка синтаксиса в или рядом с «to_id» ЛИНИЯ 1: ... избирают * от подобных left join message_log ml on ml to_id = like ... ^ ********** Ошибка ********** ОШИБКА: ошибка синтаксиса в точке или рядом с "to_id" SQL state: 42601 Персонаж: 53 – Arya

+0

Мой запрос, который занимал 30 минут для выполнения, возвращает 64742 строк, но тот, у кого есть соединение, которое вы отправили, возвращает 138095 строк – Arya

+0

у вас есть дубликат userid? –

2
select * 
from likes 
    left join message_log ml on ml.to_id=likes.userid 
where ml.to_id is null 

Попробуйте запрос с LEFT JOIN вместо и оставить только UserIds без mesages

+0

Я получаю эту ошибку ОШИБКА: синтаксическая ошибка в точке или рядом с "to_id" LINE 3: left join message_log ml on ml to_id = likes.userid ^ ********** Ошибка ********** ОШИБКА: ошибка синтаксиса при или около "to_id" Состояние SQL: 42601 Персонаж: 61 – Arya

+0

исправлено. добавлено точка пропущена – StanislavL

+0

возвращает ни одной строки на всех – Arya

1

Первое, что вы должны рассмотреть переворачивает вспомогательный запрос в соединение. Пример: select like.col1, like.col2 from likes like left join message_log mlog on like.userid = mlog.to_id where mlog.to_id is null Хотя оптимизатор, скорее всего, сделает это за вас.

Еще одна вещь, которую вы должны попробовать - это избавиться от звездочки от предложения select (как в моем примере), поскольку это может повлиять на индексы, используемые оптимизатором.

Смежные вопросы