优化 mysql 查询性能和速度

优化 mysql 查询性能和速度

我需要一些 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;

您的数百个查询可能合并为一个 :)。当然,您必须确保两个表上都有适当的索引。

相关内容