Хранение часто доступных данных в файле, а не MySQL

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

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

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

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

9 ответов


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

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

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


  1. оптимизируйте свои запросы (используя MySQL slow query log) и объясните функцию.

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

  3. попробуйте использовать шаблон двигателя, как Smarty (smarty.net). Он имеет свою собственную систему кэширования, которая работает довольно хорошо и действительно уменьшит нагрузку на сервер.

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


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

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


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

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


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


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

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

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


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

чтение статического файла намного быстрее, чем добавление накладных расходов через обработку php и mysql.


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

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

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

более важно иметь колодец разработана система, которая облегчает изменения по мере необходимости.


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

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

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