首先提出问题,稍后解释。
在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
答案 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].*)