2016-04-26 2 views
3

Давайте представим себе домашнюю страницу в Facebook. Есть список сообщений, я сообщаю сообщение, и эта почта заблокирована.Это хороший способ использовать НЕ В?

Итак, в PHP & Mysql backend, я бы сделал что-то вроде.

  1. reported_posts = MySQL GROUP_CONCAT(reported_post_id) и получать все мои сообщенные сообщения, хранить его в какой-то кэш, как Memcached или Redis. Это даст мне ответ с запятыми в следующих сообщениях: 123, 234, 45
  2. Извлечь все homepage_posts которые являются NOT IN (reported_posts). Это даст нам все post_ids, которые должны быть на главной странице, кроме сообщений, 123, 234 и 45, так как я использовал NOT IN.

Проблема заключается в том, что с течением времени reported_posts будет продолжать увеличиваться (позволяет предположить, что он увеличивает 1000 идентификаторов). В то время предложение NOT IN (reported_posts) будет принимать огромный вклад. Будет ли это влиять на производительность запроса? Какое альтернативное решение?

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

EDIT

в отчётном пост не следует рассматривать как на глобальном, то есть если я сообщаю пост, он должен быть скрыт только для меня, а не для кого-то еще. Таким образом, он также зависит от account_id.

+0

Вы можете просто добавить условие WHERE, чтобы не получать сообщения. Как 'WHERE сообщено_coulmn <> 0'. Учитывая, что вы взяли столбец для сообщений и его булевское значение. –

+0

Нет причин использовать такую ​​сводную таблицу. Это можно сделать, но вы достигнете хита производительности. – Machavity

ответ

3

Предполагая, что reported_posts содержит список конкретных пользователей в черном списке сообщений, было бы гораздо лучше сделать эксклюзивные левое соединение и пусть базы данных обрабатывать все:

SELECT * 
FROM homepage_posts hp 
LEFT JOIN 
    reported_posts rp 
    ON hp.id = rp.post_id  
     AND rp.account_id = 123 
WHERE 
    rp.id IS NULL 
+0

Таблица, из которой мы получаем 'report_posts', содержит список пользовательских сообщений в черном списке, т.е. имеет столбцы' account_id' и 'post_id' –

+0

Привет, еще нет , Я соглашусь, когда я это сделаю. Это должно сработать. благодаря –

0

В MySQL «IN» оператор отлично работает, если колонка индексируется. Если этот столбец не проиндексирован, он влияет на производительность.

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