我有多个设备(11个具体),每秒发送一次信息。这个信息在一个apache服务器中收到,由一个PHP脚本解析,存储在数据库中,最后显示在一个gui中。 我现在正在做的是检查是否存在当前日期的行,如果不存在则创建新行,否则更新它。 我这样做的原因是因为我需要从数据库中轮询信息并将其显示在c ++应用程序中,以使其看起来像实时;如果我每次设备发送信息时都要创建一行,处理和读取数据将占用大量的时间以及系统资源(内存,CPU等),这使得数据显示不太真实 - 时间。 我编写了一个报告生成工具,它可以获取每天的信息(从00:00:00到23:59:59)并将其放在Excel电子表格中。
我的问题基本上是:
是否可以直接在数据库服务器中执行插入/更新部分,还是必须在php脚本中执行逻辑?
在不降低显示设备性能的情况下,是否有更好(更有效)的方式存储信息?
关于报告生成,如果我想采样间隔,可以说从昨天的15:50:00开始到今天12:45:00结束,我的当前数据结构无法完成,那么做什么呢我需要考虑制作一个允许我创建此类查询的数据结构。
我使用的组件: - Apache 2.4.4 - PostgreSQL 9.2.3-2 - PHP 5.4.13
答案 0 :(得分:1)
我的建议 - 只存储您的设备正在发送的所有信息。使用适当的索引和查询,您可以非常快速地从DB处理和检索信息。
对于你的问题:
是的,可以使用SQL,PL / pgSQL,PL / PHP,PL / Java,PL / Py以及Postgres内置的许多其他语言在Postgres DB中构建您想要的任何逻辑。
正如我之前所说的那样 - 正确的索引可以做出魔术。
如果使用全表无法获得所需的查询速度 - 您可以为每个设备创建一个包含1行的小表。并在此表中保留最后的已知值,以便在sort of real-time
中显示它们。
答案 1 :(得分:1)
1)该技术称为upsert。在PG 9.1+中,可以使用wCTE(http://www.depesz.com/2011/03/16/waiting-for-9-1-writable-cte/)
完成2)如果您真的希望它是实时的,您应该将数据直接发送到应用程序,如果您只关心最后几个值,将其存储在内存或纯文本文件中也会更快。但PG确实有收听/通知频道,所以你的滞后可能只有100-200 mili而且你不应该只是显示它。
答案 2 :(得分:0)
我认为鉴于您所描述的过程,您高估了内存系统要求。每秒(或每秒11个)添加一行数据并不是一大堆资源。事实上,UPDATE与ADD新行相比可能更耗时。此外,如果向表中添加TIMESTAMP,则排序操作非常快。只需每天一次添加一些垃圾收集处理作为CRON作业(删除旧数据),你就是黄金。
但是要回答你的问题:
是否可以直接在数据库服务器中执行插入/更新部分,或者我是否必须在php脚本中执行逻辑?
使用数据库引擎编写逻辑通常不是很直接。为了保持简单,坚持使用php脚本中的逻辑。 UPDATE(或)INSERT INTO表SET var1 ='assignment1',var2 ='assignment2'(WHERE id ='checkedID')
是否有更好(更有效)的方式来存储信息而不会降低显示设备的>性能?
很难回答,因为您尚未描述显示设备的连接性。有更有效的方法来完成这个过程,但没有一个具有这种频繁更新所需的锁定机制。
关于报告生成,如果我想采样间隔,可以说从昨天15:50:00开始到今天12:45:00结束,我的当前数据>结构无法完成,那么什么我是否需要考虑制作一个允许我创建此类查询的数据结构。
您可以使用TIMESTAMP变量类型。这将包括UPDATE操作的DATE和TIME。然后它只是一个在数据库查询中使用DATE函数的简单WHERE子句。