PHP Лучший способ кешировать результаты MySQL? - PullRequest
28 голосов
/ 16 марта 2011

В настоящее время я создаю фреймворк PHP (оригинал, я знаю) и работаю над некоторыми функциями оптимизации для него.Одна дилемма, с которой я столкнулся, - каков наилучший способ кэширования результатов MySQL?Я знаю, что некоторые люди скажут: сначала оптимизируйте свой MySQL и т. Д., Но, скажем так, ради аргументов мой запрос выполняется за 1 минуту и ​​максимально оптимизирован.

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

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

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

Существуют ли другие (читай: быстрее) способы кэширования медленного запроса для частого использования?

Ответы [ 4 ]

18 голосов
/ 16 марта 2011

Если это прямой массив, то вы могли бы использовать var_export () вместо сериализации (оборачивая его соответствующим "" и записав его в файл .php; тогда include (), что в вашем скрипте. Лучше всего, если вы можете записать его вне дерева htdocs, и только действительно подходит для больших объемов данных, которые кэши памяти сочли бы чрезмерными.

12 голосов
/ 16 марта 2011

Memcached .

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

// serialize an array of all results
$serialzedData = serialize($resultData);

// set TTL (60 seconds) and create cache filename with timestamp
$ttl = 60;
$cacheFilename = $ttl . '_' . time() . '_' . md5($sqlQuery)

// dump
file_put_contents($cacheFilename, $serializedData);

До запуска запроса он будет искать в каталоге cache файлы с соответствующим хешем запроса. Если это так, он проверяет timestamp + ttl <= current_time и, если true, возвращает несериализованное содержимое файла. В противном случае перезаписать его.

4 голосов
/ 16 марта 2011

Mysql кеширует результат запроса, может быть вам стоит увеличить размер кеша mysql запроса?Или кэшировать результат большого запроса в отдельной таблице?

3 голосов
/ 16 марта 2011

Google для Memcache, это должно направить вас в правильном направлении.

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