Php 只返回行计数的高效查询

Php 只返回行计数的高效查询,php,mysql,Php,Mysql,我在about页面上运行了五个不同的查询,显示了一些基本数据,比如我们网站上的新闻报道数量。我使用的查询如下: $sql4 = "SELECT `ride_id` FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'" ; $result4 = $pdo->query($sql4); $coasters = $result4->rowCount(); 但我想知道是否有更有效的方法。我试图通过只拉id来最小化负载,但因为我只需要计

我在about页面上运行了五个不同的查询,显示了一些基本数据,比如我们网站上的新闻报道数量。我使用的查询如下:

$sql4 = "SELECT `ride_id` FROM `tpf_rides` WHERE `type` LIKE '%Roller Coaster%'" ;
$result4 = $pdo->query($sql4);
$coasters = $result4->rowCount();
但我想知道是否有更有效的方法。我试图通过只拉id来最小化负载,但因为我只需要计数,负载可以减轻得更多吗


而且,这些查询实际上每天只需要运行一到两次,而不是每次加载页面时。有人能告诉我怎么做吗?我以前从来没有这样做过。谢谢。

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

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`;

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

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

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`;

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

如果您想偶尔运行这些查询,则需要将结果存储在某个位置。这可以采用您自己管理的预先计算的总和或简单缓存的形式。 下面是一个非常简单和幼稚的缓存实现,应该可以在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);
}
$cache_directory=“/tmp/”;
$cache_life=86400;//保持缓存的时间(秒)。24小时=86400秒
$sql4=“从'tpf_rides'中选择count(*),其中'type'类似于'%roll Coaster%'”;
$cache_key=md5($sql4)//为查询生成半唯一标识符
$cache\u file=$cache\u目录$缓存_键;//生成完整缓存文件路径

如果(!file_exists($cache_file)| | time()如果您想偶尔运行这些查询,则需要将结果存储在某个位置。这可以是您自己管理的预先计算的总和,也可以是简单的缓存。 下面是一个非常简单和幼稚的缓存实现,应该可以在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);
}
$cache_directory=“/tmp/”;
$cache_life=86400;//以秒为单位保留缓存的时间。24小时=86400秒
$sql4=“从'tpf_rides'中选择count(*),其中'type'类似于'%roll Coaster%'”;
$cache_key=md5($sql4);//为查询生成半唯一标识符
$cache\u file=$cache\u目录。$cache\u key;//生成完整的缓存文件路径

如果(!file_存在($cache_file)| | time()是否可以使
中的'type'类似于(“%a%”、“%b%”)中的
??@DrixsonOseña…总之,不是。除非你在寻找实际值
'%a%'
'%b%'
一样不懂通配符。如果你需要这样做,你可以设置一个正则表达式。@gordon谢谢你的快速回复,我不知道我能做到这一点。那么我该如何实际地回显结果呢lt?@user2574794…我对PDO不是很熟悉。不过,获取查询返回的特定变量的结果应该很容易。使用memcache或类似工具缓存结果可能也是个好主意。是否可以将
WHERE'type'设置为类似于(“%a%”,“%b%”)
??@DrixsonOseña…总之,不是。除非你在寻找实际值
'%a%'
'%b%'
一样不懂通配符。如果你需要这样做,你可以设置一个正则表达式。@gordon谢谢你的快速回复,我不知道我能做到这一点。那么我该如何实际地回显结果呢lt?@user2574794…我对PDO不是很熟悉。不过,获取查询返回的特定变量的结果应该很容易。使用memcache或类似工具也可以缓存结果。