我有一个每天运行到LOAD DATA INFILE到MySQL数据库的cron脚本。 我想使用PHP作为Web应用程序的一部分,生成一个每周报告,显示最近7天内插入的logging总数。
我想知道这个最好的方法。 修补或修改MySQL不是一个选项,改变数据插入的方式也不是。 我宁愿避免在插入之前计算CSV文件,因为将这些数据读入PHP会很麻烦。
build议?
它必须在PHP应用程序内? 在你的cron脚本中,你可以计算要插入的行数,并将它们添加到日志文件中,或者添加到mysql数据库中的一个小日志表中(除非这是你修改mysql的意思)。 我不知道,但我想myql函数row_count()也将与INFILE数据一起工作,所以计算数字将是容易的。
而且,也许是最简单的方法,如果行在插入后没有被修改,你可以添加一个时间戳列到数据库,它会自动设置为插入的date,并计数一个星期的数字。
运行LOAD DATA INFILE查询后立即使用PHP mysql_info()函数。 这将返回一个string,如:
logging:1删除:0跳过:0警告:0
请参阅php函数参考:mysql_info()相关将是mysql_affected_rows()函数。
不pipe你做什么,都不要依赖SHOW TABLE STATUS中的行数。 根据存储引擎的不同,它可能是非常不正确的,而且只有在查询优化器对优化做出更好的判断时才有用。 这在SHOW TABLE STATUS中有logging (具体部分在这里引用)
行
行数。 一些存储引擎(如MyISAM)存储确切的计数。 对于其他存储引擎,如InnoDB,这个值是一个近似值,可能会与实际值相差40%到50%。 在这种情况下,使用SELECT COUNT(*)来获得准确的计数。
INFORMATION_SCHEMA数据库中的表的行值为NULL。
如果你感兴趣的是特定模式和表中的行数(假设没有行删除),那么你可以使用MySQL命令show table status或者从命令行使用mysqlshow --status dbname 。 这将为模式中的每个表列出一些扩展的信息,包括行数(或者可以用来select特定的表)。
可以使用INFORMATION_SCHEMA数据库中的简单SQL检索相同的数据,如下所示:
SELECT Table_name,SUM(Table_rows)FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in('table1','table2');
您可以创build一个简单的cron作业,每天进行一次这个快照,然后从PHP中以有用的方式提取数据应该相当容易。 哎呀,你甚至可以把它存储在数据库表中;-)