2009-06-30 165 views
3

计算插入到数据库中的新记录的最简单方法是什么?是否可以在加载查询中包含计数查询?收集mysql统计信息

还是需要更复杂的东西,比如记录现有的最后一个记录并计算后面添加的所有内容?

编辑:

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

我无法修补mysql,或大幅改变数据库架构/结构,但我可以添加新的表或字段。我不希望从csv文件中计数记录并将此结果存储在文本文件中。 INstead,我宁愿在PHP中查询所有内容。

回答

1

这可能取决于什么被确定为新的。它是否在最后五分钟或十分钟内输入到数据库中?或者它是否超过某个自动识别码的记录?

如果你正在寻找基于时间的方法来确定什么是新的,你可以有一个字段(可能是类型的日期时间),记录插入记录的时间和获取数字,你只需做一个...

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

如果你不想通过记录时间去,你可以使用一个自动递增键,简单地跟踪最后插入的ID和计数,在任何给定时间之后的那些名字窗口。所以如果一小时前ID是10000,那么自那时起插入了大量记录。您需要计算大于10000的所有记录,并跟踪最后一个插入ID并在需要时重复。

+0

每次加载完成时,加载的条目将被视为新的,无论日期如何。 – 2009-06-30 14:18:51

+0

你究竟是什么意思的“负载”。 SQL中没有LOAD关键字。你的意思是插入? – defines 2009-07-07 13:27:37

+0

在mysql中有一个LOAD命令... – 2009-07-07 13:44:37

0

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

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

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

更新:这里 OK是你需要做之前得到一个计数什么,后: 创建为计数的表:

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表现在您的加载前后会有计数。

+0

创建时间戳字段不是一个选项,因为结构无法更改。我不会在PHP中执行加载,因此受影响的行在这里不会帮助我。 – 2009-06-30 14:34:51

+0

你如何加载数据? – Craig 2009-07-07 18:42:46

+0

从csv文件加载数据infile – 2009-07-10 09:26:32

0

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

2

假设您使用的是Mysql 5或更高版本,您可以创建一个触发器,在插入到特定表格时触发。请注意,“插入”触发器也会通过“LOAD”命令触发。

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

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

编辑

另外,如果你不想,你可以在存储过程中执行的“加载”操作的数据库中的持久化数据。这将允许您在开始Load之前和Load完成之后在表上执行select count()。您只需要减去结果值以确定在加载过程中插入了多少行。

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

1

如果你是不是在一个特定的表,你可以使用以下命令:

show global status like "Com_%"; 

这将显示你的每一个类型的查询统计。这些数字只是继续计数,所以如果你想使用它们,在开始跟踪查询时记录初始数字,并从最终数字中减去它(但是,这是给定的)。

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

0

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

0

这可能比您想要的更简单,但Nagios监视器跟踪行数呢? (也可以考虑在serferfault.com上询问;这些东西完全是他们的胡同。)

0

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

0

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

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

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

0

您可以在表格上使用触发器,该触发器将插入到您创建的表格中,该表格在结构中具有时间戳吗?

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

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

祝你好运,

马特

0

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

请参阅利马公司发布的关于如何在MySQL中创建触发器的链接。

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

0

所以'load'只会在表中插入新数据?或重写整个表?

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

select count(*) from yourtable
装货前和加载后曾经一度...差别会告诉你有多少新记录,其中插入..

如果在另一方面你改写整个表格,并且想要找到不同的来自以前版本的记录..那么你需要一个完全不同的方法..

这是哪一个?

0

既然你问了最简单的方法,我建议你使用触发器在插入。您可以使用单列,单行表格作为计数器并使用触发器进行更新。