3

计算插入数据库的新记录的最简单方法是什么?是否可以在负载查询中包含计数查询?

还是需要更复杂的东西,例如记录现有的最后一条记录并计算在它之后添加的所有内容?

编辑:

我有一个 cron 作业,它在直接传递给 mysql 的脚本中使用 LOAD DATA INFILE。此数据与 php Web 应用程序一起使用。作为 php web 应用程序的一部分,我需要生成每周报告,包括上周插入了多少条记录。

我无法修补 mysql,或彻底更改数据库架构/结构,但我能够添加新表或字段。我不希望从 csv 文件中计算记录并将结果存储在文本文件或其他文件中。相反,我更愿意在 PHP 中使用查询来做所有事情。

4

14 回答 14

2

假设您使用 Mysql 5 或更高版本,您可以创建一个触发器,该触发器会在插入特定表时触发。请注意,“插入”触发器也会使用“加载”命令触发。

使用触发器需要您将计数信息保存在单独的表中。基本上,您需要创建一个包含 1 行/列的新表来保存计数。然后触发器将使用加载的数据量更新该值。

这是关于触发器的 MySQL 手册页,语法相当简单。 http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

编辑

或者,如果您不想将数据保留在数据库中,您可以在存储过程中执行“加载”操作。这将允许您在开始加载之前和加载完成之后对表执行 select count()。您只需要减去结果值即可确定在加载期间插入了多少行。

这是有关过程的 MySQL 手册页。 http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

于 2009-07-06T15:01:02.290 回答
1

这可能取决于被确定为新的东西。是在最后 5 分钟还是 10 分钟等内输入数据库的条目?或者它是否有任何超过某个自动 ID 的记录?

如果您正在查看基于时间的方法来确定新内容,您可以有一个字段(可能是 datetime 类型)记录插入记录的时间并获取数字,您只需执行...

select count(*) from table where currentTime > 'time-you-consider-to-be-new'

如果您不想记录时间,您可以使用自动增量键并简单地跟踪最后插入的 ID 并计算在任何给定时间窗口之后出现的 ID。因此,如果一小时前 ID 为 10000,则从那时起插入了许多记录。您将需要计算所有大于 10000 的记录并跟踪最后一个插入 ID 并在需要时重复。

于 2009-06-30T14:11:43.510 回答
1

如果您不查看特定表,则可以使用以下内容:

 show global status like "Com_%";

这将向您显示每种查询的统计信息。这些数字一直在计数,因此如果您想使用它们,请在开始跟踪查询时记录初始数字,然后从您的最终数字中减去这个数字(但是是的,这是给定的)。

如果您正在寻找纯粹的统计数据,我可以推荐将 Munin 与 MySQL 插件一起使用。

于 2009-07-07T22:05:38.767 回答
0

您的问题有点模棱两可,但它们 mysql c API 提供了一个函数“mysql_affected_rows”,您可以在每次查询后调用该函数以获取受影响的行数。对于插入,它返回插入的行数。请注意,对于更新,它返回更改的行数,而不是匹配 where 子句的行数。

如果您正在执行多个查询并且需要知道插入了多少个查询,那么最可靠的方法可能是在查询之前和之后进行计数。

正如在 sobbayi 的回答中所指出的,在您的表中添加“创建于”时间戳将允许您查询在给定时间之后(或之前)创建的记录。

更新:好的,这是您在前后获得计数所需要做的:为计数创建一个表:

create table row_counts (ts timestamp not null, row_count integer not null);

在您的脚本中,在加载文件内联查询之前和之后添加以下内容:

insert into row_counts (ts,row_count) select now(),count(0) from YOUR_TABLE;
load file inline......
insert into row_counts (ts,row_count) select now(),count(0) from YOUR_TABLE;

row_counts 表现在将在您加载之前和之后进行计数。

于 2009-06-30T14:28:15.130 回答
0

看看这是否是您感兴趣的那种 MySQL 数据收集:http ://code.google.com/p/google-mysql-tools/wiki/UserTableMonitoring 。

如果是这种情况,Google 在http://google-mysql-tools.googlecode.com/svn/trunk/mysql-patches/all.v4-mysql-上提供了一个 MySQL 补丁(适用于干净的 mysql 目录源) 5.0.37.patch.gz您可以在http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patches阅读有关该补丁的更多信息。

如果这不是您想要的,我建议您多解释一下自己,以便我们更好地帮助您。

于 2009-07-11T09:42:25.273 回答
0

你从哪里加载数据?您可以考虑在将它们插入数据库之前对其进行计数。如果它是一个 sqlscript,您可能会编写一个快速而肮脏的 bash 脚本(使用 grep 或类似的东西)来计算字段。

于 2009-07-06T14:31:41.947 回答
0

你说你不能改变结构。这是否意味着您无法更改要插入的表,或者您根本无法更改数据库?如果您可以添加一个表,那么只需创建一个包含 2 列的表 - 一个时间戳和您正在加载的表的键。在加载 csv 文件之前,请创建另一个仅包含这两列的 csv 文件,然后在主文件之后加载该 csv。

于 2009-07-11T04:15:05.747 回答
0

由于您要求最简单的方法,我建议您在插入时使用触发器。您可以使用单列单行表作为计数器并使用触发器对其进行更新。

于 2009-07-28T18:02:13.223 回答
0

也许您可以编写一个小的 shell 脚本来查询数据库的行数。然后,您可以有一个每分钟/小时/天等运行的 Cron 作业,并将 COUNT 输出到日志文件。随着时间的推移,您可以查看日志文件并查看数据库的增长速度。如果您还在日志文件中添加了日期,则可以在较长时间内更轻松地查看它。

于 2009-07-11T08:52:59.680 回答
0

这可能比您想要的要简单,但是使用Nagios监视器来跟踪行数呢?(也可以考虑在 serferfault.com 上四处询问;这些东西完全是他们的拿手好戏。)

于 2009-07-11T04:23:36.043 回答
0

您能否在表上使用触发器,该触发器将插入您创建的表中,该表在结构中具有时间戳?

然后,您可以使用期间范围的日期计算来查找所需的信息。

我不知道您使用的是什么版本的 mysql,但这里是 5.0 版中触发器创建语法的链接:http: //dev.mysql.com/doc/refman/5.0/en/create-trigger.html

祝你好运,

马特

于 2009-07-13T07:50:04.610 回答
0

好吧,如果您需要详尽的信息:插入、更新或删除了哪些行,创建一个额外的审计表来存储这些带有时间戳的东西可能是有意义的。你可以用触发器做到这一点。我还将编写一个存储过程,它将作为事件执行并删除旧条目(无论您认为旧条目)。

请参阅 Lima 发布的有关如何在 MySQL 中创建触发器的链接。

请参阅 Paul Dubois(第 2 版)的“MySQL Cookbook”的第 655 页或 Joe Celko 的“SQL for smarties”的第 158 页。

于 2009-07-13T07:57:04.003 回答
0

所以“加载”只会在表中插入新数据?或重写整个表?

如果它会加载新数据,那么你可以做一个

select count(*) from yourtable
加载前一次,加载后一次......差异将显示插入了多少新记录..

另一方面,如果您重写整个表并希望找到与以前版本不同的记录..那么您将需要一种完全不同的方法..

哪一个 ?

于 2009-07-13T10:56:08.137 回答
0
show global status like 'Com_insert';

flush status并且show session status...仅适用于当前连接。

http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html#statvar_Com_xxx

于 2009-07-15T15:22:27.210 回答