Как кешировать mysql_query с помощью memcache? - PullRequest
2 голосов
/ 08 февраля 2011

Я хотел бы знать, возможно ли сохранить "ресурс" в memcache, в настоящее время я пытаюсь использовать следующий код, но, видимо, он не правильный:

$result = mysql_query($sSQL);
$memcache->set($key, $result, 0, $ttl);
return $result;

Ответы [ 2 ]

9 голосов
/ 08 февраля 2011

Я должен не согласиться с zerkms. Тот факт, что MySQL имеет систему кеширования (на самом деле ее несколько), не означает, что оптимизировать доступ к базе данных не имеет смысла. QuSQL Cache в MySQL великолепен, но все же имеет ограничения:

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

Даже с удаленным сервером Memcached примерно на 23% быстрее, чем MQC . А используя объектный кеш APC, вы можете получить улучшение на 990% по сравнению с использованием только MQC.

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

И то, что сервер достаточно быстрый, не означает, что вам не следует стремиться писать эффективный код. Не так уж много усилий, чтобы кэшировать результаты базы данных - особенно, когда ускорители типа APC и Memcached были разработаны именно для этой цели. (И я не отклонил бы этот вопрос как такую ​​«странную идею», когда некоторые из крупнейших сайтов в Интернете используют Memcached в сочетании с MySQL .)

Тем не менее, zerkms верен в том смысле, что вы должны сначала получить результаты, а затем вы можете кэшировать данные, используя APC или Memcached. Тем не менее, существует другой вариант кэширования результатов запроса вручную, который заключается в использовании плагина кэширования результатов запроса Mysqlnd . Это клиентский кеш результатов MySQL-запросов.

Плагин кэширования результатов запросов Mysqlnd позволяет вам прозрачно кэшировать ваши запросы, используя APC, Memcached, sqlite или указанный пользователем источник данных. Однако этот плагин в настоящее время имеет то же ограничение, что и MQC, в том, что подготовленные операторы не могут быть кэшированы.

0 голосов
/ 08 февраля 2011

Зачем тебе это нужно?Mysql имеет свой собственный перманент кэш запросов

, но если вы все еще хотите следовать своей странной идее - вам нужно извлечь все данные в массив (с mysql_fetch_assocили что угодно) и после этого сохранить этот массив в memcached.

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