高效查询只返回行数

时间:2013-08-08 00:24:56

标签: php mysql

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

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

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

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

2 个答案:

答案 0 :(得分: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`;

这比运行三个不同的查询更快。

答案 1 :(得分: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);
}

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