MySQL считая производительность - PullRequest
3 голосов
/ 12 июля 2011

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

Будет ли мне лучше подсчитывать сообщение каждый раз, или я должен создать новый столбец под названиемnumOfMsg и увеличивать его при получении сообщения.

РЕДАКТИРОВАТЬ:

Кажется, что phpBB http://wiki.phpbb.com/Table.phpbb_topics хранит номера ответов в базе данных, кто-нибудь знает, что они намереныбыл

Ответы [ 4 ]

1 голос
/ 12 июля 2011

Вы можете просто использовать функцию MySQL COUNT() для подсчета сообщений.Если вы используете соответствующие индексы, это очень быстро.(Если вы подсчитаете количество пользователей + ящиков, вы захотите иметь комбинированный индекс для пользователей + ящиков)

Обратите внимание, что MySQL также будет кэшировать результаты ваших запросов, так что новые сообщения не поступили[ваша таблица сообщений не изменилась] она даже не вернется к памяти / диску, чтобы выполнить фактический подсчет;он просто вернет последнее значение.Таким образом, очень дешевая операция.

Проблема с сохранением дополнительной избыточной информации заключается в том, что может быть очень трудно поддерживать ее в актуальном состоянии;Вы можете добавлять или удалять сообщения;некоторые пользователи могут перемещать сообщения между ящиками, и все это время вы должны держать счетчики правильными.Вам также придется начать использовать транзакции, чтобы убедиться, что INSERT сообщения и UPDATE счетчика либо выполнены, либо оба не выполнены (например, когда вы теряете связь или что-то падает).

1 голос
/ 12 июля 2011

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

Мой совет - продолжайте считать, если это не влияет на производительность.Когда производительность снижается из-за подсчета, кэшируйте счет.Когда даже кеша недостаточно, вы можете подумать о денормализации базы данных.Преждевременная оптимизация бесполезна, и ответ действительно зависит от масштаба приложения и частоты появления новых сообщений.

1 голос
/ 12 июля 2011

Это хороший вопрос, и ответ, вероятно, зависит от масштаба вашего приложения. Ведение подсчета определенно облегчит / ускорит извлечение этих чисел, когда они вам нужны, но это также сделает ваш код намного более сложным, потому что вы должны отслеживать каждый раз, когда сообщение вставляется, удаляется или перемещается между почтовые ящики / папки (если это разрешено вашим приложением).

Если вы готовы приложить все усилия, чтобы поддерживать актуальность счета, это, вероятно, хороший подход для такого рода вещей.

Я, конечно, использую этот счетчик состояний в коде, который я пишу.

0 голосов
/ 12 июля 2011

Не очень хорошая идея иметь numOfMsg поле imo, так как вы должны следить за числом в вашей программе.В любом случае, MySQL оптимизирует COUNT (*) , и я сомневаюсь, что это будет узким местом в вашем приложении.

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