Вопрос производительности sql - PullRequest
2 голосов
/ 07 августа 2009

Я создаю форум.

И мне интересно, стоит ли мне хранить количество ответов в таблице тем или считать сообщения в теме?
Насколько медленнее будет, если я буду использовать sql и считать их? Допустим, у меня миллиард постов. Это будет намного медленнее? Я не планирую быть таким большим, но что, если? Насколько медленнее я был бы по сравнению с тем, чтобы набирать номер в темах?

Спасибо

Ответы [ 6 ]

4 голосов
/ 07 августа 2009

Это будет медленнее по мере того, как ваш БД увеличивается в размере Если вы планируете иметь большую таблицу сообщений, сохраните значение в таблице тем

3 голосов
/ 07 августа 2009

Я только что провел несколько тестов на MySQL 4.0, у нас есть таблица с более чем 1 миллионом записей.

SELECT COUNT(*) FROM MyTable; ~ 1 миллион занял 22мс

SELECT COUNT(*) FROM MyTable WHERE Role=1; ~ 800 000 заняло 3,2 с

SELECT COUNT(*) FROM MyTable WHERE Role=2; ~ 20 заняло 12 мс

Столбец Роль в этом случае был проиндексирован, и он подключался к MySQL удаленно.

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

2 голосов
/ 07 августа 2009
  1. Не сохраняйте значение в таблице.
  2. Кэшируйте значение в приложении на некоторое время, поэтому запрос count (*) не будет выполняться слишком часто.
  3. Выберите время кэширования в зависимости от нагрузки на сервер: больше для очень занятых и ноль для пары пользователей.

Счетчик (*) в SqlServer довольно быстрый (при условии, что у вас есть индекс для поля, на которое вы рассчитываете). Так что вам просто нужно уменьшить количество попаданий при большой нагрузке.
Если вы сохраните значение в таблице, у вас будет много хлопот, поддерживая его.

1 голос
/ 07 августа 2009

Это повлияет на масштабирование и является проблемой нормализации. Хардкорные ботаники по нормализации скажут вам, что вы не должны держать количество постов по теме, потому что это приводит к избыточным данным. Но вы должны иметь в виду, что если вы не сохраните его там, вам нужно будет выполнить дополнительный запрос при каждой загрузке, чтобы получить число. Альтернатива - вместо этого делать дополнительный запрос при каждом обновлении / вставке, что почти всегда будет происходить гораздо реже, чем в select. По мере того, как вы масштабируете сайт для поддержки большого трафика, становится почти неизбежным, что вам в конечном итоге придется начать нормализовать некоторые из ваших данных, особенно в таких случаях.

Избыточные данные не являются плохими по своей природе. Плохо управляемая избыточность есть. Пока у вас есть надлежащие проверки, чтобы предотвратить несинхронизацию данных, потенциальная выгода от хранения количества сообщений в потоке стоит дополнительного бита кода IMO.

0 голосов
/ 07 августа 2009

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

0 голосов
/ 07 августа 2009

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

Индексы (индексы?) Могут быть более приятным вариантом, поскольку вы можете хранить крошечное подмножество данных и иметь доступ к более богатой информации. Примите во внимание тот факт, что подсчет количества Фарли в телефонной книге может быть довольно быстрым, потому что я могу пойти прямо туда и легко сосчитать их.

Так что, как это часто бывает, ответ, вероятно, «Это зависит».

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