0

我在关于页面上运行了五个不同的查询,显示基本数据,例如我们在网站上拥有的新闻故事的数量。我正在使用这样的查询:

$sql4 = "SELECT `ride_id` FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'" ;
$result4 = $pdo->query($sql4);
$coasters = $result4->rowCount();

但想知道是否有更有效的方法。我试图通过仅拉 id 来最小化负载,但是因为我只需要计数,负载可以减轻更多吗?

此外,这些查询实际上每天只需要运行一次或两次,而不是每次加载页面时。有人可以指出我的设置方向吗?我以前从来没有这样做过。谢谢。

4

2 回答 2

5

是的,有一种更有效的方法。让数据库为您计算:

SELECT count(*) as cnt
FROM `tpf_rides`
WHERE `type` LIKE '%Roller Coaster%';

如果您要查找的所有计数都来自tpf_rides表,那么您可以在一个查询中完成它们:

SELECT sum(`type` LIKE '%Roller Coaster%') as RollerCoaster,
       sum(`type` LIKE '%Haunted House%') as HauntedHouse,
       sum(`type` LIKE '%Ferris Wheel%') as FerrisWheel
FROM `tpf_rides`;

这甚至比运行三个不同的查询还要快。

于 2013-08-08T00:26:48.220 回答
1

如果您只想不时地运行这些查询,那么您需要将结果存储在某个地方。这可以采用您自己管理的预先计算的总和或简单缓存的形式。下面是一个非常简单和幼稚的缓存实现,应该可以在 linux 上可靠地工作。很多事情都可以在这里改进,但也许这会让你知道你可以做什么。以下与返回多个计数的 Gordon Linoff 建议的查询不兼容。

该代码尚未经过测试。

$cache_directory = "/tmp/";
$cache_lifetime  = 86400; // time to keep cache in seconds. 24 hours = 86400sec

$sql4 = "SELECT count(*) FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'";

$cache_key  = md5($sql4); //generate a semi-unique identifier for the query
$cache_file = $cache_directory . $cache_key; // generate full cache file path

if (!file_exists($cache_file) || time() <= strtotime(filemtime($cache)) + $cache_lifetime)
{
    // cache file doesn't exist or has expired
    $result4  = $pdo->query($sql4);
    $coasters = $result4->fetchColumn();
    file_put_contents($cache_file, $coasters); // store the result in a cache file
} else {
    // file exists and data is up to date
    $coasters = file_get_contents($cache_file);
}

我强烈建议您将其分解为处理问题不同方面的功能。

于 2013-08-08T00:59:45.233 回答