我需要一些 mysql 查询方面的帮助,我正在尝试提高它的性能和速度,
我正在尝试弄清楚如何使用 mysql 语法来做到这一点。
这是我在统计 php 脚本中使用的查询函数的片段,用于获取访问者的一些国家信息。
function countries() {
$countryname = array();
$countrycode = array();
$countrytotal = array();
$countrydownloads = array();
$countryrate = array();
$countries = query ("SELECT country,code, count(*) as total FROM visitors group by country order by total DESC");
while ($country = mysql_fetch_array($countries))
{
$download = query("SELECT COUNT(id) as total FROM visitors WHERE download = 1 and country = '$country[country]';");
if(mysql_num_rows($download) == 0) {$downloads[0] = 0;} else { $downloads = mysql_fetch_array($download); }
$rate = intval( ($downloads[0] * 100) / $country[total])." %";
array_push($countryname,$country[country]);
array_push($countrytotal,$country[total]);
array_push($countrydownloads,$downloads[0]);
array_push($countryrate,$rate);
array_push($countrycode,$country[code]);
}
return array($countryname,$countrytotal,$countrydownloads,$countryrate,$countrycode); }
该查询首先从访问者表中按名称分组收集所有国家/地区的数据。然后收集第一个查询产生的每个组的下载量。
我的问题是,如果访问者表有 150 个不同国家的记录,并按名称分组,然后它会收集每个组的下载量,如果国家组的每个查询都需要 0.5 秒,则整个函数将需要 150 * 0.5 = 75 秒,这太糟糕了,执行查询的速度非常慢。
因此存在两个问题:
1)我对第一个函数执行单独的查询,该查询将仅返回组中的国家名称,然后执行另一个单独的查询,使用 php 循环收集每个国家的下载量,当有许多组时,这会花费更多时间。
2)第二个查询计算每个组的下载量,它用于在整个访问者表中搜索记录,而不仅仅是在该国的组中搜索,这也会降低性能。
那么,对于这两个问题,有没有什么好的解决方案,只进行一次查询,就可以按名称对各个国家进行分组,并给出各个国家的下载总数和每个组的下载量,而且速度更快,性能更好?
非常感谢您的帮助,谢谢
答案1
SELECT c.country, c.code, COUNT(v.id) AS total FROM country c INNER JOIN visitors v ON (c.country = v.country) WHERE v.download = 1 GROUP BY v.country ORDER BY total DESC;
您的数百个查询可能合并为一个 :)。当然,您必须确保两个表上都有适当的索引。