缓存MySQL的结果集


Caching a MySQL Resultset

我需要一个在APC缓存中存储MySQL结果集的工作代码!
我在谷歌上搜索了一下。所以,没有找到任何!
希望有人能分享一个工作代码。

的例子:

$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);
如何在APC中存储输出的SQL结果?

我想知道的代码缓存它在APC(不是在MySQL)

您可能并不想这样做!

在应用程序中添加缓存层应该是您做的最后事情之一。缓存可以发现代码中大量的bug,无论是细微的还是明显的。

如果你想提高代码的性能,你应该执行代码分析并消除真正的瓶颈,而不是感知到的瓶颈。

特别是在这种情况下。

这里的示例查询是坏的。可怕的,甚至。您正在从表中的每一行中获取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从缓存中取出,这更可能是您想要完成的。请注意,这里我故意省略了缓存过期时间。

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

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

这是一个工作代码:)

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