PHP,如何编写更快的查询来更新大对象

时间:2017-04-16 02:47:17

标签: php mysql sql performance

我有以下查询,它非常完美。它允许我获取点来绘制数据库中的图形,适用于大范围的输入时间帧和选项。

$get_net_sql=   "SELECT  nic_name,
        AVG(bytes_sent) as down_speed,
        AVG(bytes_recv) as up_speed,
        unix_timestamp
    FROM (  SELECT  nic_name, bytes_sent, bytes_recv,
                (".
                  $sql_sample_size.
                  "*ROUND(unix_timestamp/". $sql_sample_size. ")
                ) As unix_timestamp
            FROM  tbl_network_stats
            WHERE  timestamp>(NOW() - INTERVAL ". $time. " ". $sql_unit. ")
         ) AS sub_table
    GROUP BY  unix_timestamp, nic_name
    ORDER BY  unix_timestamp, nic_name DESC;";

当然,当您处理数天或数周的数据时,这是一个缓慢的查询。所以我想做的是用这个查询绘制图形(在画布上)并更新运行图形间隔的json对象,每秒钟查询速度更快。

我加入了工作,但我找不到上面查询的正确速度更快的版本...现在写这就是我得到的:

$get_net_sql = "SELECT  nic_name,
        bytes_sent as down_speed,
        bytes_recv as up_speed,
        unix_timestamp
    FROM  tbl_network_stats
    WHERE  unix_timestamp = 
        (  SELECT  unix_timestamp
            FROM  tbl_network_stats
            ORDER BY  unix_timestamp DESC
            LIMIT  1
        )";

我在这里要解决的真正问题是,当我每隔一秒用第一个查询不断更新我的图表以便它实时更新时,这是完美的但每次抓取所有新数据并且速度很慢,我的处理器由于这个原因,网络和ram趋势数据有3个类似的查询,因此上涨了25%。那么,如果他们消耗了25%的cpu,谁会想看这些花哨的图表呢!

我想到的解决方案,我正在寻求帮助或替代方案,是在页面加载上运行第一个查询,并以每秒一个更快的速度加入它。

谢谢你Maango,看看索引有什么不同(我可能花了一个月的时间来解决这个问题,非常感谢你,这么明显却埋没了一个解决方案):enter image description here

1 个答案:

答案 0 :(得分:1)

我有两点建议:

首先将子查询更改为:

(SELECT max(unix_timestamp) FROM tbl_network_stats)

这可能会有所不同,但我没有你的数据来测试它。

其次,添加索引:

ALTER TABLE tbl_network_stats ADD INDEX ux_ts (unix_timestamp);

这将加速任何需要查找值的ORDER BY或其他条款。