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