首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP到MySQL性能优化

PHP到MySQL性能优化
EN

Stack Overflow用户
提问于 2017-05-10 14:56:38
回答 2查看 2K关注 0票数 0

我收集传感器数据,将它们存储在一个MySQL DB中,并将数据作为一个JSON对象加载到一个高级图表中,用于图形表示。

现在我的桌子上有大约200k个条目。我认识到生成JSON大约需要3.5秒。我想随着更多的条目,我会变得太慢。

是否有优化JSON处理的方法?

在生成JSON的PHP代码之后:

代码语言:javascript
复制
$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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-11 11:57:20

我想您可以首先优化查询:

代码语言:javascript
复制
SELECT unix_timestamp(time)*1000 as time, value1, value2 from ". $feedID." 
WHERE value2 is not null";

接下来,你可能不需要那么多图表上的数据。尝试一次减少在高图表上显示的数据的数量。

例如,当你在看如何到达你所在城市的郊区时,谷歌地图不会载入整个世界。在图表上渲染200 k行会非常慢,所以即使你要调整后端,前端也会被卡住。在一整段时间内,您可能会选择提供日期/月的数据,例如:

代码语言:javascript
复制
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的记录需要呈现在一个图表上。

票数 2
EN

Stack Overflow用户

发布于 2017-05-11 12:13:46

生成JSON大约需要3.5秒

而是意味着json_encode($response);需要3.5秒--真的是这样吗?你的剧本里没有时间。如果您的意思是数据到达客户端需要3.5秒,那么您需要分离:

  • 从数据库检索数据和构建aray的时间。
  • json_encode()的时间
  • 输出数据的时间
  • 数据穿越网络的时间。
  • 在客户端解析数据的时间。

假设成本在json_encode()中(或者在构建非常大的数组--这将导致内存问题),那么您应该逐步构建输出.

代码语言:javascript
复制
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");在做什么?您的代码不接受范围。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43896121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档