我有一个id(eventids
)数组,表中可能有数百万或十亿个id。我使用for循环遍历每个id并使用PHP中的查询操作从dynamo db表中检索项目。但是,由于查询操作会在我的表中查看大量信息,因此查询操作执行其工作所需的时间过长。所以,在这种情况下,我没有得到任何结果,因为我有时间。以下代码尝试执行此操作,该操作因大量信息而失败。我想知道您是否有任何关于如何使$sfweventarrayRDS
数组内的大量ID更快且可行的查询操作的建议或建议?
for ($j = 0 ; $j < count($sfweventarrayRDS) ; $j++){
$keyconditions = array(
"eventid" => array(
"ComparisonOperator" => ComparisonOperator::EQ,
"AttributeValueList" => array(
array(Type::NUMBER => $sfweventarrayRDS[$j]["eventid"])
)
)
);
$sfweventarrayDynamo = Dynamo::getItems("eventlocation",$keyconditions,$limit);
if (count($sfweventarrayDynamo) > 0){
$timediffepoch = $sfweventarrayDynamo[0]["edatecreated"]["N"] - $sfweventarrayRDS[$j]["edatecreated"];
$timediffstandard = new DateTime("@$timediffepoch");
if ($timediffstandard->format('i') >= 5){
$starttimeepoch = $sfweventarrayRDS[$j]["edatecreated"];
$endtimeepoch = $sfweventarrayDynamo[0]["edatecreated"]["N"];
$starttimestandard = new DateTime("@$starttimeepoch");
$endtimestandard = new DateTime("@$endtimeepoch");
$each_event = array("eventid" => $sfweventarrayDynamo[0]["eventid"]["N"],
"organizationid" => $sfweventarrayRDS[$j]["organizationid"],
"userid" => $sfweventarrayDynamo[0]["userid"]["N"],
"starttime" => $starttimestandard->format('Y-m-d H:i:s'),
"endtime" => $endtimestandard->format('Y-m-d H:i:s'),
"location" => $sfweventarrayRDS[$j]["location"],
"startlatitude" => $sfweventarrayRDS[$j]["latitude"],
"startlongitude" => $sfweventarrayRDS[$j]["longitude"],
"endlatitude" => $sfweventarrayDynamo[0]["latitude"]["N"],
"endlongitude" => $sfweventarrayDynamo[0]["longitude"]["N"]);
array_push($safewalkeventsDynamo, $each_event);
}
}
}
答案 0 :(得分:0)
可以有两种可以改善查询操作的可能解决方案:
使用批量获取:如果您已经知道事件ID并想要查询数据库以获取更多信息,那么批量获取将是理想的。您创建一个包含100个ID(允许的最大值)的块,并调用DynamoDB以一次获取信息。重复,直到获得所有ID。 Here是文档链接。
您可以根据需要增加表的读取容量。 (这将导致为dynamoDB支付更多的钱。)