2

我有多个设备(具体来说是 11 个)每秒发送信息。这些信息在 apache 服务器中接收,由 PHP 脚本解析,存储在数据库中,最后显示在 gui 中。我现在正在做的是检查当天是否存在一行,如果不存在则创建一个新行,否则更新它。我这样做的原因是因为我需要从数据库中轮询信息并将其显示在 C++ 应用程序中以使其看起来有点实时;如果我要在每次设备发送信息时创建一行,处理和读取数据将花费大量时间以及系统资源(内存、CPU 等),从而使数据的显示不太真实-时间。我写了一个报告生成工具,它获取每天的信息(从 00:00:00 到 23:59:

我的问题基本上是:

  • 是否可以直接在数据库服务器中执行插入/更新部分,还是必须在 php 脚本中执行逻辑?

  • 是否有更好(更有效)的方式来存储信息而不会降低显示设备的性能?

  • 关于报告生成,如果我想对间隔进行采样,假设从昨天 15:50:00 开始到今天 12:45:00 结束,我当前的数据结构无法完成,所以我需要按顺序考虑制作一个允许我创建此类查询的数据结构。

我使用的组件: - Apache 2.4.4 - PostgreSQL 9.2.3-2 - PHP 5.4.13

4

3 回答 3

1

我的建议 - 只需存储所有信息,您的设备正在发送。通过适当的索引和查询,您可以非常快速地处理和检索数据库中的信息。

对于您的问题:

是的,可以使用 SQL、PL/pgSQL、PL/PHP、PL/Java、PL/Py 和 Postgres 内置的许多其他语言在 Postgres DB 中构建您想要的任何逻辑。

正如我之前所说 - 正确的索引可以发挥作用。

如果您无法通过全表获得所需的查询速度 - 您可以为每个设备创建一个包含 1 行的小表。并在此表中保留最后一个已知值以将它们显示在sort of real-time.

于 2013-05-21T20:28:23.067 回答
1

1)该技术称为upsert。在 PG 9.1+ 中,可以使用 wCTE ( http://www.depesz.com/2011/03/16/waiting-for-9-1-writable-cte/ )

2)如果你真的希望它是实时的,你应该将数据直接发送到应用程序,如果你只关心最后几个值,将它存储在内存或纯文本文件中也会更快。但是 PG 确实有收听/通知频道,所以你的延迟可能只有 100-200 英里,而且你只显示它不应该太多。

于 2013-05-21T20:37:43.857 回答
0

鉴于您描述的过程,我认为您高估了内存系统要求。每秒(或每秒 11 个)添加一行数据并不占用大量资源。事实上,更新与添加新行可能更耗时。此外,如果您将 TIMESTAMP 添加到表中,排序操作会非常快。只需每天一次左右添加一些垃圾收集处理作为 CRON 作业(删除旧数据),您就可以了。

但是要回答您的问题:

是否可以直接在数据库服务器中执行插入/更新部分,或者我是否必须在 php 脚本中执行逻辑?

使用数据库引擎编写逻辑通常不是很直接。为了保持简单,请坚持使用 php 脚本中的逻辑。UPDATE (或) INSERT INTO table SET var1='assignment1', var2='assignment2' (WHERE id = 'checkedID')

是否有更好(更有效)的方式来存储信息而不降低显示设备的性能?

很难回答,因为您没有描述显示设备的连接性。有更有效的方法来完成该过程,但是没有一种方法具有如此频繁更新所需的锁定机制。

关于报告生成,如果我想对时间间隔进行采样,可以说从 >昨天 15:50:00 到今天 12:45:00 结束,我当前的数据 > 结构无法完成,所以我需要考虑什么为了制作一个>允许我创建此类查询的数据结构。

您可以使用 TIMESTAMP 变量类型。这将包括 UPDATE 操作的 DATE 和 TIME。然后它只是一个在数据库查询中使用 DATE 函数的简单 WHERE 子句。

于 2013-05-21T20:28:16.203 回答