Хранение часто используемых данных в файле, а не MySQL - PullRequest
6 голосов
/ 11 февраля 2010

Я работаю над системой управления контентом PHP и, тестируя, заметил, что довольно много таблиц MySQL системы запрашиваются почти на каждой странице, но очень редко пишутся.Что мне интересно, так это начнёт ли это сильно влиять на базу данных при увеличении трафика сайта, и как я могу решить / предотвратить это?

Сначала я думал о том, чтобы начать хранить некоторые более статичные данные в файлах(используя сериализацию PHP), но действительно ли это снижает нагрузку на сервер?Меня беспокоит то, что я просто перенесу высокую нагрузку с базы данных на файловую систему!

Если бы кто-нибудь мог подсказать мне о лучшем подходе, это было бы здорово.Если объем самих данных оказывает большое влияние, я подробно опишу некоторые данные, которые буду хранить ниже:

  • Полный список стран (включая коды стран ИСО)
  • Параметры сайта (скин, адрес электронной почты администратора, URL-адреса поддержки и т. Д.)
  • Группы пользователей (включая разрешения)

Ответы [ 9 ]

13 голосов
/ 11 февраля 2010

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

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

Вероятно, лучше придерживаться базы данных.

5 голосов
/ 11 февраля 2010
  1. Оптимизируйте свои запросы (используя журнал медленных запросов mysql) и функцию EXPLAIN.

  2. Если таблицы действительно редко записываются, вы можете использовать встроенное кэширование MySQL. Вам нечего менять в своем коде, просто включите кэширование mysql в my.conf.

  3. Попробуйте использовать шаблонизатор, такой как Smarty (smarty.net). Он имеет свою собственную систему кеширования, которая работает довольно хорошо и ДЕЙСТВИТЕЛЬНО снижает нагрузку на сервер.

  4. Вы также можете использовать Memcache, но его действительно стоит использовать только с очень загруженными сайтами. (Я думаю, что Smarty будет достаточно.)

2 голосов
/ 11 февраля 2010

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

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

2 голосов
/ 11 февраля 2010

Базы данных намного лучше справляются с большими объемами данных, чем собственная файловая система.

Не беспокойтесь об оптимизации сайта для снижения нагрузки на сервер, пока у вас не возникнет проблема с нагрузкой на сервер. : -)

1 голос
/ 11 февраля 2010

Базы данных как раз для этого. Для хранения и предоставления данных. Файловая система предназначена для скриптов и программирования.

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

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

1 голос
/ 11 февраля 2010

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

0 голосов
/ 11 февраля 2010

Вот ссылка на пару сценариев, которые по существу сделают то, о чем говорит dusoft, и кешируют выходной буфер в файл:

http://www.addedbytes.com/articles/caching-output-in-php/

Используемый таким образом, это скорее решение типа «болт на факте», но такое же поведение, безусловно, может быть реализовано более интегрированным образом, если рассматривать его в начале процесса. Во многие фреймворки также встроены подобные вещи.

0 голосов
/ 11 февраля 2010

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

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

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

Более важно иметь хорошо спроектированную систему, которая способствует изменениям по мере возникновения потребностей.

0 голосов
/ 11 февраля 2010

вы можете кэшировать вывод (flush (), ob_flush () и т. Д.) В файл и include, который вместо нескольких чтений MySQL. кэширование определенно быстрее, чем доступ к MySQL несколько раз.

чтение статического файла намного быстрее, чем добавление служебной информации с помощью обработки php и mysql.

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