我在我的页面上运行了五个不同的查询,显示基本数据,例如我们在网站上的新闻报道数量。我正在使用这样的查询:
$sql4 = "SELECT `ride_id` FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'" ;
$result4 = $pdo->query($sql4);
$coasters = $result4->rowCount();
但是想知道是否有更有效的方法。我试图通过仅拉动id来最小化负载但是因为我只需要计数可以减轻负载吗?
此外,这些查询实际上每天只需要运行一次或两次,而不是每次都加载页面。有人能指出我的设定方向吗?我以前从来没有这样做过。感谢。
答案 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);
}
我强烈建议你将其分解为处理问题不同方面的功能。