收集mysql统计信息

时间:2009-06-30 12:56:14

标签: sql mysql load-data-infile

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

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

编辑:

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

我无法修补mysql,或者无法彻底更改数据库架构/结构,但我可以添加新的表或字段。我宁愿不计算csv文件中的记录并将此结果存储在文本文件或其他内容中。顺便说一句,我更喜欢从PHP中查询所有内容。

14 个答案:

答案 0 :(得分:2)

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

使用触发器需要您将计数信息保存在单独的表中。基本上你需要创建一个包含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

答案 1 :(得分:1)

这可能取决于被确定为新的东西。它是在最后五分钟或十分钟内输入数据库的条目等吗?或者它是否超过某个自动ID?

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

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

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

答案 2 :(得分:1)

如果您没有查看特定的表格,可以使用以下内容:

 show global status like "Com_%";

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

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

答案 3 :(得分: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表现在将在加载之前和之后有计数。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分: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-5.0.37.patch.gz提供一个MySQL补丁(以应用于干净的mysql目录源)。您可以在http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patches了解有关该修补程序的更多信息。

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

答案 9 :(得分:0)

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

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

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

祝你好运,

马特

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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

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

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

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

是哪一个?

答案 12 :(得分:0)

show global status like 'Com_insert';

flush statusshow session status...仅适用于当前连接。

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

答案 13 :(得分:0)

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