Каков наилучший способ отфильтровать записи из большого набора данных - PullRequest
3 голосов
/ 03 апреля 2019

У меня около 500 000 записей пользователей в одной таблице, а другая таблица содержит записи пользователей, специально заблокированных другими пользователями (то есть, какой пользователь заблокировал какого пользователя). Я использую следующий запрос для фильтрации записей о пользователях для текущего пользователя, которые не содержат заблокированных пользователей из заблокированной таблицы.

SELECT * from demouser where id not in (select blockedid from demoblock where userid = 1 )

Это медленно, занимает около 2 секунд для выполнения запроса. Есть ли более эффективный способ фильтрации записей без сравнения 500 000 записей пользователей с заблокированной таблицей для удаления заблокированных пользователей из результатов?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Я бы написал это как not exists:

select du.*
from demouser du
where not exists (select 1
                  from demoblock db
                  where db.blockedid = du.id and
                        db.userid = 1
                 );

Для этого запроса вы хотите индекс на demoblock(blockedid, userid).

2 голосов
/ 03 апреля 2019

Создайте индексы для столбцов id и userid по отдельности, поэтому и подзапрос, и запрос будут выполняться быстрее.

Также рекомендую небольшую модификацию:

select * from demouser du
where not exists(select 1 from demouser
                 where blockedid = du.id
                   and userid = 1)
1 голос
/ 03 апреля 2019

Предполагая, что ваша таблица demoblock не содержит большого количества данных, вы можете попробовать с помощью INNER JOIN.Пример запроса ниже:

SELECT * FROM demouser INNER JOIN demoblock ON demouser.id=demoblock.id WHERE demoblock.id=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...