我收集传感器数据,将它们存储在一个MySQL DB中,并将数据作为一个JSON对象加载到一个高级图表中,用于图形表示。
现在我的桌子上有大约200k个条目。我认识到生成JSON大约需要3.5秒。我想随着更多的条目,我会变得太慢。
是否有优化JSON处理的方法?
在生成JSON的PHP代码之后:
$sql = "SELECT time, value1, value2 from ". $feedID;
$result = mysqli_query($con, $sql);
while ($row = mysqli_fetch_array($result)) {
if ( $row[2] == null ) {
$response[data][] = array( (strtotime($row['time']))*1000, (float) $row[1]);
} else {
$response[data][] = array( (strtotime($row['time']))*1000, (float) $row[1], (float) $row[2]);
}
}
$return = json_encode($response);
header('Content-type: text/json');
header('Content-Length: '.strlen($return)."\r\n");
header('Accept-Ranges: bytes'."\r\n");
echo $return;发布于 2017-05-11 11:57:20
我想您可以首先优化查询:
SELECT unix_timestamp(time)*1000 as time, value1, value2 from ". $feedID."
WHERE value2 is not null";接下来,你可能不需要那么多图表上的数据。尝试一次减少在高图表上显示的数据的数量。
例如,当你在看如何到达你所在城市的郊区时,谷歌地图不会载入整个世界。在图表上渲染200 k行会非常慢,所以即使你要调整后端,前端也会被卡住。在一整段时间内,您可能会选择提供日期/月的数据,例如:
SELECT
month(`time`) as mo,
year(`time`) as `year`,
avg(value1) as value1,
avg(value2) as value2
FROM table
WHERE
value2 is not null
GROUP by year(`time`), month(`time`)考虑到上面的查询,您可能希望修改您拥有的表,这样您就不需要计算月和年了,但是您更愿意将它存储在写上。当您写入数据库时,您可能还希望在另一个表/存储中具有聚合数据,以便您可以轻松地访问它。
所以,通常的答案是:尽量减少数据量。我甚至无法想象一个现实世界的情况,当200 K的记录需要呈现在一个图表上。
发布于 2017-05-11 12:13:46
生成JSON大约需要3.5秒
而是意味着json_encode($response);需要3.5秒--真的是这样吗?你的剧本里没有时间。如果您的意思是数据到达客户端需要3.5秒,那么您需要分离:
假设成本在json_encode()中(或者在构建非常大的数组--这将导致内存问题),那么您应该逐步构建输出.
header('Content-type: text/json');
$sql = "SELECT time, value1, value2 from ". $feedID;
$result = mysqli_query($con, $sql);
print "{ "data" : ";
$join="[\n";
while ($row = mysqli_fetch_assoc($result)) {
print $join;
$response = array(
(strtotime($row['time']))*1000
, (float) $row['value1']
);
if ($row['value2']!==null) {
$response[]=(float) $row['value2'];
}
print json_encode($response);
$join=",\n";
}
print "]\n}\n";我的桌子上有大约200k个条目。
显示器上有多少像素?你在绘制什么样的图表?
你最大的胜利将来自处理更少的数据。
顺便说一句:你认为header('Accept-Ranges: bytes'."\r\n");在做什么?您的代码不接受范围。
https://stackoverflow.com/questions/43896121
复制相似问题