2011-02-08 2 views
2

Я хотел бы знать, если это возможно, чтобы сохранить «Ressource» в пределах кэша памяти, я сейчас пытаюсь следующий код, но, видимо, это не правильно:Как кэшировать mysql_query с помощью memcache?

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

Ресурс не может кэшировать, результаты запроса ... ** ДА ** – ajreal

ответ

-2

Зачем вам это? Mysql имеет своего собственного производительногоquery cache

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

+3

Я не хочу, чтобы мое приложение дважды запрашивало мою базу данных для одной и той же вещи. – Roch

+0

@mnml: не является memcached хранилищем тоже? В чем разница между запросом mysql (и извлечением данных из кеша запроса) и извлечением из memcached? ;-) В любом случае вы должны извлечь все данные из ресурса и кэшировать массив результатов. – zerkms

+2

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

9

Я должен не соглашаться с zerkms. Просто потому, что у MySQL есть система кэширования (на самом деле она имеет несколько), не означает, что нет никакой пользы для оптимизации доступа к базе данных. В MySQL Query Cache велик, но он все еще имеет ограничения:

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

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

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

И только потому, что сервер достаточно быстр, это не значит, что вы не должны стремиться писать эффективный код. Не так много усилий, чтобы кэшировать результаты базы данных —, особенно когда такие ускорители, как APC и Memcached, были предназначены для этой цели. (И я не стал бы отклонять этот вопрос как таковую «странную идею», когда some of the largest sites on the internet use Memcached in conjunction with MySQL.)

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

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

Смежные вопросы