Bill Gray Asked: 2009-07-13 01:01:53 +0800 CST2009-07-13 01:01:53 +0800 CST 2009-07-13 01:01:53 +0800 CST 创建每周 MySQL 报告 772 我有一个每天运行的 cron 脚本,用于将 DATA INFILE 加载到 MySQL 数据库中。我想使用 PHP 作为 Web 应用程序的一部分,生成每周报告,显示过去 7 天插入的记录总数。 我想知道解决这个问题的最佳方法。修补或修改 MySQL 不是一种选择,改变数据的插入方式也不是。我宁愿在插入之前避免计算 CSV 文件,因为将这些数据读入 PHP 会很麻烦。 建议? mysql php 3 个回答 Voted Sven 2009-07-13T01:31:59+08:002009-07-13T01:31:59+08:00 它必须在 PHP 应用程序中吗?在您的 cron 脚本中,您可以计算要插入的行数,并将它们添加到日志文件或 mysql 数据库内的一个小日志表中(除非这是修改 mysql 的意思)。我不确定,但我猜 myql 函数 row_count() 也可以处理 INFILE 数据,所以计算数字会很容易。 而且,也许是最简单的方法,如果插入后未修改行,您可以在数据库中添加一个时间戳列,该列会自动设置为插入日期,然后 count() 增加一周的数字。 Travis Campbell 2009-07-17T12:45:22+08:002009-07-17T12:45:22+08:00 运行 LOAD DATA INFILE 查询后立即使用 PHP mysql_info() 函数。这将返回一个字符串,如: 记录:1 删除:0 跳过:0 警告:0 请参阅php 函数参考:mysql_info() 相关的是mysql_affected_rows()函数。 无论您做什么,都不要依赖 SHOW TABLE STATUS 中的行数。根据您的存储引擎,它可能非常不正确,并且实际上只对查询优化器有用,以便对优化做出更好的判断。这记录在SHOW TABLE STATUS中(此处引用了特定部分) 行 行数。一些存储引擎,例如 MyISAM,存储确切的计数。对于其他存储引擎,例如 InnoDB,这个值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的计数。 对于 INFORMATION_SCHEMA 数据库中的表,Rows 值为 NULL。 Guss 2009-07-13T01:31:53+08:002009-07-13T01:31:53+08:00 如果您只对特定模式和表中的行数感兴趣(并假设没有删除行),那么您可以使用 MySQL 命令show table status或从命令行使用mysqlshow --status dbname. 这将为架构中的每个表列出一些扩展信息,包括行数(或者您可以使用它like来选择特定表)。 可以使用 INFORMATION_SCHEMA 数据库中的简单 SQL 检索相同的数据,可能如下所示: SELECT Table_name,SUM(Table_rows) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in ('table1','table2'); 您可以创建一个简单的 cron 作业,每天拍摄一次此快照,然后以一种有用的方式从 PHP 中提取该数据应该相当容易。哎呀,您甚至可以将其存储在数据库表中;-)
它必须在 PHP 应用程序中吗?在您的 cron 脚本中,您可以计算要插入的行数,并将它们添加到日志文件或 mysql 数据库内的一个小日志表中(除非这是修改 mysql 的意思)。我不确定,但我猜 myql 函数 row_count() 也可以处理 INFILE 数据,所以计算数字会很容易。
而且,也许是最简单的方法,如果插入后未修改行,您可以在数据库中添加一个时间戳列,该列会自动设置为插入日期,然后 count() 增加一周的数字。
运行 LOAD DATA INFILE 查询后立即使用 PHP mysql_info() 函数。这将返回一个字符串,如:
请参阅php 函数参考:mysql_info() 相关的是mysql_affected_rows()函数。
无论您做什么,都不要依赖 SHOW TABLE STATUS 中的行数。根据您的存储引擎,它可能非常不正确,并且实际上只对查询优化器有用,以便对优化做出更好的判断。这记录在SHOW TABLE STATUS中(此处引用了特定部分)
如果您只对特定模式和表中的行数感兴趣(并假设没有删除行),那么您可以使用 MySQL 命令
show table status
或从命令行使用mysqlshow --status dbname
. 这将为架构中的每个表列出一些扩展信息,包括行数(或者您可以使用它like
来选择特定表)。可以使用 INFORMATION_SCHEMA 数据库中的简单 SQL 检索相同的数据,可能如下所示:
SELECT Table_name,SUM(Table_rows) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in ('table1','table2');
您可以创建一个简单的 cron 作业,每天拍摄一次此快照,然后以一种有用的方式从 PHP 中提取该数据应该相当容易。哎呀,您甚至可以将其存储在数据库表中;-)