Производительность PHP: Запрос к базе данных при каждом попадании? - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть таблица СОБЫТИЙ в базе данных.(MySQL) Когда пользователь получает URL-адрес www.example.com/today, сервер выполняет операторы PHP с SQL-запросом к базе данных.

SELECT * FROM event WHERE DATE(date_end) >= DATE(NOW()) AND DATE(date_start) <= DATE(NOW())

Вопрос: стоит ли делать это таким образом, тогда какЯ мог бы создать какой-нибудь «подготовленный» статический файл или таблицу со свежими событиями и их данными каждый день?

И дополнительный вопрос: вы бы предложили использовать Yii?Потому что на моем локальном хосте это выглядит довольно медленно.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Не используйте NOW () в своем запросе.
NOW () не кешируется в кеш запросов mysql.

документы: - http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html

Запрос не может быть кэширован, если он содержит какие-либо функции, показанные в следующей таблице.
NOW ()

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

$start_date = date('Y-m-d 00:00:00', time());
$end_date = date('Y-m-d 23:59:59', time());

DATE(date_end) >= DATE(NOW()) AND DATE(date_start) <= DATE(NOW())
==>
date_end between $start_date and $end_date
and
date_start <= $end_date

Что еще более важно, создайте составной индекс для date_start и date_end
если условие where всегда требует сравнения обоих столбцов

Хранить все в статическом порядке,
но это требует больше усилий для истечения срока действия / недействительности кэша при обновлении.

Использовать ли Yii - второстепенное соображение, сначала исправьте очевидную проблему
(это дорогостоящий запрос MySQL).

0 голосов
/ 07 декабря 2011

Yii поддерживает кеширование (лично я никогда не использовал Yii, поскольку я человек Symfony, но это не имеет значения)

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

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

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

Вы можете сделать оптимизацию. Например, взгляните на YSlow. Используя этот плагин Firefox, вы можете посмотреть, где на вашей странице горлышки бутылок. то есть много фоновых изображений? превратить его в спрайт. Не используете CDN для загрузки Jquery? затем используйте CDN. Изменение размеров изображений с использованием свойств ширины и высоты? Фактически изменить размер изображения и т. Д.

С точки зрения производительности PHP. Взгляните на APC , который является ускорителем PHP. Вы должны заметить значительный прирост производительности, когда ваше PHP-приложение становится сложным, и вы выполняете много кода. Однако для простой страницы, вызывающей только один запрос, вы, вероятно, не заметите значительного прироста производительности.

Для mysql используйте индексы. Если вы ищете событие, используя столбец имени события, убедитесь, что у вас есть индекс для этого столбца.

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

Итак, подведем итог:

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

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