PHP多个同时选择?

时间:2015-12-09 04:46:22

标签: php mysql mysqli

首先提出问题,稍后解释。

在PHP中,有没有办法同时发送多个SQL选项,让mysql同时处理所有选择?

因为单独等待所有回复太长了。

代码中我需要什么?

我有这个:

$sqlStringArray[0=>"SELECT a,b,c,d,e,f FROM T1 JOIN (SELECT x... WHERE) AS RandomJoin WHERE... ORDER BY... GROUP BY....",
            1=>"SELECT x,y FROM T2 WHERE...",
            2=>"SELECT random FROM randomTable WHERE...";

我使用这样的东西:

/* This is not good enough, each select could take 2 seconds */
foreach ($sqlStringArray as $key => $value) {
    $mysqli->query($value);
}

我想要这样的事情:

$resultSet = $mysqli->executeAllSelectsAtTheSameTimeAsynchronous($sqlStringArray);

(无需阅读以下内容)

我对我的英语很感兴趣,希望它足以让我理解。

(原因) 我有一个性能监控系统,增长非常快(160,000个可过滤项目,每个280个计数器,每个计数器4个记录/小时),每天大约4.300.800.000个新记录。

UI允许用户选择他们想要查看的计数器,日期范围,公式(例如,总和2计数器,减去其他计数器,按区域/名称/类型/任何东西进行过滤)。

一切都运行良好,但有些用户选择了120多种不同的公式,每个公式都将返回一个JSON数据,由高图处理,在用户界面显示,每个选择大约2~5秒(我相信我在选择部分做得非常好,我不认为我可以改进它,因为每当用户使用他自己的公式时,我无法总结那些数据,他们看起来随机进入网络[实际上只有当他们有用户投诉时才会看]。

我想知道是否有任何方法可以发送"选择列表"为了让mysql一次处理所有内容并返回一堆数组。

@MyWay解决了它,在一些测试下(Filename自我解释),我在所有文件中使用相同的查询,所以我运行的越多,它就越快就不知道为什么,但差别是如此巨大,以至于没关系,至少快8倍。

testusr@garbageServer:/dev/shm/test/20151209$ php teste_diogo_sequential.php
Memory spike:
not real: 0.22097778320312 MiB
real: 0.25 MiB

Total execution time in seconds: 87.4132

testusr@garbageServer:/dev/shm/test/20151209$ php teste_diogo_multiquery.php
Memory spike:
not real: 0.22097778320312 MiB
real: 0.25 MiB

Total execution time in seconds: 11.1795

testusr@garbageServer:/dev/shm/test/20151209$ php teste_diogo_multiquery_JSON.php
Memory spike:
not real: 0.22097778320312 MiB
real: 0.25 MiB

Total execution time in seconds: 6.9231

testusr@garbageServer:/dev/shm/test/20151209$ php teste_diogo_sequential.php
Memory spike:
not real: 0.22097778320312 MiB
real: 0.25 MiB

Total execution time in seconds: 62.1036

2 个答案:

答案 0 :(得分:2)

使用PHP multi_query

<?php
$conn = mysqli_connect("localhost", "username", "password", "db");
$query  = "SELECT a,b,c,d,e,f FROM T1 JOIN (SELECT x... WHERE) AS RandomJoin WHERE... ORDER BY... GROUP BY....;";
$query .= "SELECT x,y FROM T2 WHERE...;";
$query .= "SELECT random FROM randomTable WHERE...";
if (mysqli_multi_query($conn, $query)) {
    do {
        if ($result = mysqli_store_result($conn)) {
            while ($row = mysqli_fetch_row($result)) {
                printf("%s\n", $row[0]);
            }
            mysqli_free_result($result);
        }
    } while (mysqli_next_result($conn));
}

mysqli_close($conn);
?>

multi_query和query

之间的效率的另一个SO question

答案 1 :(得分:1)

尝试这将帮助您使用多个选择:

[^0-9]*\\s([0-9,]*)\\s([^0-9].*)