Схема БД для подсчета непрочитанных писем на почтовый ящик - PullRequest
0 голосов
/ 29 апреля 2019

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

Моя схема на данный момент выглядит следующим образом:

CREATE TABLE emails(id INT, user_id INT, folder INT, 
    read_on TIMESTAMP, raw_email_filename VARCHAR(128));

Чтобы получить счетчик непрочитанных для каждой папки, я мог бы выполнить запрос вроде:

SELECT count(*) FROM email WHERE user_id =? AND folder IN (?..) AND read_on IS NULL;

Но для этого нужно было бы просмотреть все электронные письма в каждой папке, чтобы получить счетчик, учитывая мой индексis (user_id, folder).

Я думал о добавлении индекса (user_id, folder, read_on), но в нем было бы слишком много записей для read_on, когда меня интересуют только значения NULL для read_on.

Есть ли лучший способ сделать это?Может быть, с нормализацией?Вести счет в Redis или что-то?

1 Ответ

0 голосов
/ 18 мая 2019

Я бы рассмотрел

INDEX(user_id, read_on, folder)

Рекомендации для построения оптимального индекса: сначала перечислите столбцы, проверенные с = (IS NULL считается как таковой), затем INs (folder), затем один диапазон ( у вас их нет).

Не беспокойтесь о потраченных впустую индексных записях для read_on IS NOT NULL записей; они загромождают диск без ущерба для производительности.

С другой стороны, когда вы меняете read_on (через UPDATE?), Происходит небольшое попадание, потому что запись в моем предложенном INDEX должна перемещаться из одного места в другое в индексе BTree. Опять же, об этом, вероятно, не стоит беспокоиться.

А тебе не нужен GROUP BY?

SELECT folder, COUNT(*)
    FROM emails
    WHERE user_id = ?
      AND folder IN (...)
      AND read_on IS NULL
    GROUP BY folder;

Do EXPLAIN SELECT .... С моим INDEX, EXPLAIN, вероятно, скажет Using index, указывая на индекс «покрытия». Вот где все необходимые столбцы находятся в индексе.

Подробнее о создании индекса: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

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