Кэширование MySQL Resultset - PullRequest
       28

Кэширование MySQL Resultset

1 голос
/ 29 апреля 2011

Мне нужен рабочий код для хранения набора результатов MySQL в кэше APC!
Я искал в Google & SO и не нашел ни одного!
Надеюсь, кто-нибудь поделится рабочим кодом.

Пример:

$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

Пример 2:

$stmt=mysqli_prepare($con,"SELECT Events FROM Calendar where UID=?");
mysqli_stmt_bind_result($stmt, "i",$UID);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $events);
while(mysqli_stmt_fetch($stmt))
{
   ...
}
mysqli_stmt_close($stmt);

Как сохранить исходящий результат SQL в APC?

я хочу знать код для его кэширования в APC (не в MySQL)

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Возможно, вы действительно не хотите этого делать!

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

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

Особенно в этом случае.

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

Даже использование этого запроса, даже если не думать о его кэшировании, опасно. Если это реальный запрос, то ваш код сломан для начала! Результаты, возвращаемые из базы данных, не гарантированно будут в любом конкретном порядке.Действительно, по крайней мере с MySQL вы можете сбросить порядок данных на диске , используя ALTER TABLE ... ORDER BY.Если вам нужна только одна строка, вы должны использовать предложение ORDER BY и предложение LIMIT, не выбирая everything , а затем извлекать только одну строку.

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

Давайте рассмотрим ваш код.

$stmt=mysqli_prepare($con,"SELECT UID FROM Users");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $UID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

В этомкод, вы готовите запрос SELECT UID FROM Users, привязывает первый столбец набора результатов к переменной PHP $UID, извлекаете одну строку, затем закрываете дескриптор оператора (отбрасывая все остальные результаты).

$UID содержит единственное значение, которое вы хотите кэшировать.Для кэширования этого значения в APC вы можете использовать apc_store:

apc_store($key, $UID);

$key - имя ключа кэша.

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

$value_in_cache = false;
$value = apc_fetch($key, $value_in_cache);
if(!$value_in_cache) {
    $value = null;
    $stmt = mysqli_prepare($con,"SELECT UID FROM Users");
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $value);
    mysqli_stmt_fetch($stmt);
    mysqli_stmt_close($stmt);
    apc_store($key, $value);
}

Этот код всегда будет пытаться вытащить $key из кэша перед запросом к базе данных, что более вероятно, что вы хотели выполнить.Обратите внимание, что здесь я намеренно не указывал время истечения срока действия кэша.

Вы заметите, что, очевидно, здесь кэшируется только одно значение.Если вы настаиваете на использовании связанных переменных результата, то вам нужно либо вручную создать массив и вместо этого кешировать этот массив.Я настоятельно рекомендую не , используя связанные переменные.Посмотрите на использование mysql_stmt_get_result для извлечения результирующего набора , из которого вы затем можете получить массив. Остерегайтесь , руководство говорит, что get_result возвращает логическое значение, но возвращает объект набора результатов в примере кода.YMMV.Могу ли я предложить PDO для ваших будущих проектов?

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

0 голосов
/ 13 июня 2011

Вот рабочий код :)

<?php
$dba_host='localhost';
$dba_name='root';
$dba_pass='';
$dba_db='DB';

$con=mysqli_connect($dba_host,$dba_name,$dba_pass,$dba_db) or die('Connection Refused !');

$stmt=mysqli_prepare($con,"SELECT UID FROM Main");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
while(mysqli_stmt_fetch($stmt))
 $result[] = $value;
mysqli_stmt_close($stmt);
apc_store('uid', $result);


$value_in_cache = false;
$value = apc_fetch('uid', $value_in_cache);
if(!$value_in_cache) {
 echo 'Looking at DB';
$stmt=mysqli_prepare($con,"SELECT UID FROM Main");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $value);
while(mysqli_stmt_fetch($stmt))
    $result[] = $value;
mysqli_stmt_close($stmt);
apc_store('uid', $result);
}
else
{
 echo 'Looking at Memory';
 print_r($result);
}

mysqli_close($con);
?>
...