PHP / SQL - 很多SQL查询

时间:2015-12-26 17:05:17

标签: php mysql sql optimization

在我的网站上,我想使用数据库中的大量不同数据。目前,我使用四个查询来收集不同的数据。但有没有办法让它更有效率并将它们放入一个大问题?我该怎么做?

编辑:所以答案是简单地将所有查询放在一起,并在数据库查询中使用尽可能多的数据操作,而不是在php中。

...
  "State": {
        "Error": "",
        "ExitCode": 9,
        "FinishedAt": "2015-01-06T15:47:32.080254511Z",
        "OOMKilled": false,
        "Paused": false,
        "Pid": 0,
        "Restarting": false,
        "Running": true,
        "StartedAt": "2015-01-06T15:47:32.072697474Z",
        "Status": "running"
    },
... 

2 个答案:

答案 0 :(得分:1)

您可以将所有查询合并为一个,如下所示:

$qry = "SELECT COUNT(*) cnt,
           AVG(level) avg_lvl,
           SUM(IF(onlinestatus=1, 1, 0)) online_cnt,
           (SELECT Max(time) FROM refreshes) refresh_time
    FROM   rookstayers";
foreach ($db->query($qry) as $row){
    $amount_total = $row['cnt']
    $level = $row['avg_lvl'];
    $online_amount = $row['online_cnt'];
    $milliseconds = $row['refresh_time'] + 1800000;
    $update_time = DateTime::createFromFormat('U', intval($milliseconds / 1000));
}

您的最后一个查询似乎假设结果中只有一条记录,因为循环会覆盖每次迭代中的前一个结果。而且由于该查询中没有order by,结果将是一个小赌博。所以我从表中获取了最近的时间,以防有多个记录。

请注意,上述循环只执行一次,因为可以保证从查询中获得一个结果。

答案 1 :(得分:0)

第一个和第三个查询可以组合成一个:

select count(*) as num, sum(onlinestatus = 1) as numOnline
from rookstayers;

第二个应该是聚合:

select level, count(*) as cnt
from rookstayers
group by level;

第四个也是聚合;我不确定数据究竟是什么样的,但它似乎是这样的:

select sum(time + 1800000)
from refreshes;

通常,您应该尽可能多地在数据库中进行数据操作。这就是数据库的设计目标。

编辑:

第一,第二和第三可以组合成:

select count(*) as num, sum(onlinestatus = 1) as numOnline,
       avg(level) as avgLevel
from rookstayers;