缓存MySQL结果集

时间:2011-04-29 05:47:12

标签: php mysql memcached apc

我需要一个工作代码,用于在MySQL缓存中存储MySQL结果集! 我搜索了Google&所以并没有找到任何! 希望有人能分享工作代码。

示例:

$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 个答案:

答案 0 :(得分:4)

你可能真的不想这样做!

向应用程序添加缓存层应该是您执行的最后之一。缓存可以发现代码中的大量错误,既微妙又明显。

如果你想提高你的代码的性能,你应该是 performing code profiling 并消除的真正的瓶颈,而不是察觉的。

特别是在这种情况下。

这里的示例查询很糟糕。太可怕了,甚至。你从获取的UID列的每行的表中,没有设定这些行的顺序,然后只获取实际的第一行,无论它可能是。

即使使用这个查询,甚至不考虑缓存它,也很危险。 如果是真正的查询,那么您的代码已损坏开头!从数据库返回的结果保证按任何特定顺序。实际上,至少在MySQL中,您实际上可以使用ALTER TABLE ... ORDER BY 重置磁盘数据排序。如果您只想要一行,则应使用ORDER BY子句和LIMIT子句,而不是选择所有内容,然后只获取一行。

我要的是你的过于简单的查询的作为例子的假设下进行操作,并且将你的幽默与两个或三个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拉出缓存,这更有可能是您想要完成的。请注意,我故意在这里停止了缓存过期时间。

你会注意到,显然这里只缓存了一个值。如果坚持使用绑定结果变量,那么您将需要手动构建数组并缓存该数组。我强烈建议使用绑定变量 not 。查看使用mysql_stmt_get_result获取result set,然后您可以从中获取数组。 注意,手册说get_result返回布尔值,但它在示例代码中返回结果集对象。因人而异。我可以为你未来的项目建议PDO吗?

无论使用什么数据库接口,都不能缓存实际的语句句柄或结果集对象,只能缓存它们返回的数据。

答案 1 :(得分:0)

这是一个有效的代码:)

<?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);
?>