MySQL база данных добавить номер в таблицу или рассчитать по запросу - PullRequest
2 голосов
/ 12 апреля 2020

Мне было интересно, лучше ли добавить столбец таблицы, в котором будет храниться количество записей X, связанных с указанным идентификатором c в другой таблице, или каждый раз вычислять количество записей в запросе.

Так, например, у меня есть следующие таблицы

Users Table

ID | name | status
------------------
1  | John |   1
2  | Jack |   2
3  | Mary |   1
Posts Table

ID | user_id |  text  | status
------------------------------
1  |    1    | blabla |   1
2  |    1    | blabla |   1
3  |    2    | blabla |   2
4  |    1    | blabla |   1
5  |    3    | blabla |   1

Лучше ли добавить дополнительный столбец в таблице пользователей с количеством сообщений, чтобы он был быстрее (? Или лучше ?) чтобы показать список из 100 пользователей и количество сообщений без каких-либо дополнительных запросов, иначе я должен проверить, сколько записей со статусом 1 связано с user_id X x 100 пользователей, например

1 Ответ

1 голос
/ 12 апреля 2020

Да, выбор одной строки на основе идентификатора пользователя будет быстрее, чем агрегирование строк из таблицы сообщений. В худшем случае агрегация будет иметь временную сложность O (n), т.е. сканируется вся таблица.

Предлагаемое вами решение, триггер, определенно ускорит эту операцию выбора. Но есть заметные недостатки. Триггер по существу добавит еще одну операцию обновления к любой вставке / обновлению в таблице сообщений. Таким образом, операции UPDATE или INSERT над таблицей сообщений будут замедлены.

Честно говоря, подобные вопросы производительности только начинают иметь значение для больших наборов данных. Я подозреваю, что то, над чем вы работаете, не настолько велико, что здесь проблема в производительности. Если я прав, я советую вам использовать самый простой подход (не иметь дополнительного столбца для отслеживания количества сообщений). Если производительность когда-либо становится проблемой, вы всегда можете добавить оптимизацию, как это позже.

...