生成mysql统计信息

Posted

技术标签:

【中文标题】生成mysql统计信息【英文标题】:generating mysql statistics 【发布时间】:2009-07-02 23:06:28 【问题描述】:

我有一个 csv 文件,它每周生成一次,并加载到一个 mysql 数据库中。我需要制作一份报告,其中将包括有关导入记录的各种统计信息。第一个这样的统计数据是导入了多少条记录。

我使用 php 与数据库交互,并将使用 php 生成显示此类统计信息的页面。

但是,csv 文件是通过 mysql 脚本导入的,与任何 PHP 完全不同。

是否可以计算导入的记录并将数字存储在不同的字段/表中,或以其他方式?

添加额外的时间字段来计算由于特定时间添加的字段是不可能的,因为数据库的结构无法更改。

在从 mysql 脚本导入时是否有可以使用的查询,或者是从 php 中生成/计算导入记录数的更好方法?

【问题讨论】:

你能澄清一下mysql脚本部分吗? cron jab 中调用的脚本是什么语言? (shell 脚本、perl、python 等...) 它只是一个带有 sql 命令的文本文件,它被输入到 mysql...mysql -uuser -ppass 【参考方案1】:

您可以使用以下查询获取表中的记录数。

SELECT COUNT(*) FROM tablename

所以你可以做的是你可以计算导入前和导入后的记录数,然后像这样选择差异。

$before_count = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS c FROM tablename"));
// Run mysql script
$after_count = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS c FROM tablename"));
$records_imported = $after_count['c'] - $before_count['c'];

如果你愿意,你可以从 MySql 脚本中完成这一切,但我认为使用 PHP 来做这件事会更干净一些。

【讨论】:

我无法集成 mysql 和 php 脚本,因为 mysql 脚本来自 cron 作业,而 php 脚本来自 Web 应用程序。我怎么能在 sql 脚本中做到这一点? 几个选项。您可以编辑 cron 脚本。将其设为 bash 脚本并在运行 mysql 脚本之前和之后调用 PHP。或者您可以进行初始计数并存储,然后执行以下操作:SELECT (SELECT QUERY FOR FINAL VALUE) - (SELECT QUERY FOR INITIAL VALUE) 我不能像你说的那样调用 php 脚本...你能扩展你的 sql 示例吗?【参考方案2】:

有点像桶式刮刀,但根据权限,您可以编辑 cron 执行的 MySQL 脚本,以使用 INTO OUTFILE 将一些更新前的统计信息输出到文件中,然后在 PHP 中解析生成的文件。然后,您将获得“之前”统计信息,并可以通过 PHP 执行统计查询以获取“之后”统计信息。

但是,与其中许多解决方案一样,使用此解决方案几乎不可能找到对现有行的更新。 (虽然新行应该很容易检测到。)

【讨论】:

嗯,这可能行得通。 cron 脚本是每天的,php 报告是每周的……所以我必须附加……你能举个例子吗?【参考方案3】:

不太清楚你在追求什么,但这里有更多细节:

    让 MySQL 使用 将相关统计信息导出到已知目录 选择...进入文件.. 此目录需要 MySQL 可读/可写 用户/组和您的网络服务器的用户/组(或任何用户/组 如果您要通过 cron 在 a 上自动执行 cli,则您正在运行 PHPas 每周一次。该文件应为 CSV 格式并带有日期戳 “stats_export_YYYYMMDD.csv”。

    让 PHP 扫描导出目录的开头文件 “stats_export_”,也许使用带有简单的“scandir”函数 子测试。然后,您可以将匹配的文件名添加到数组中。一次 您的文件用完了,请对数组进行排序以确保其按日期顺序排列。

    从数组中列出的每个文件中读取统计数据 转用 fgetcsv。将此数据放入干净的文件中是明智的 数组,其中还包含从中提取的相关日期戳 文件名。

    此时,您将在每个结束时获得统计信息摘要 数组中的一天。然后您可以执行相关的统计 SQL 查询 再次(如果需要)直接从 PHP 中添加统计信息到数据中 数组。

    根据需要比较/对比和输出。

【讨论】:

【参考方案4】:

使用 PHP 和 'LOAD DATA INFILE .... INTO TABLE ..' 加载文件,然后使用 mysqli_affected_rows()(或 mysql_affected_rows)获取导入的行数

【讨论】:

以上是关于生成mysql统计信息的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的统计信息学习总结

MySQLMySQL 5.7持久化统计信息详解

MySQL innodb统计信息

找出MySQL索引的使用情况统计数据?

MySQL 统计信息

MySQL索引统计信息更新相关的参数