毎週のMySQLレポートの作成

毎週のMySQLレポートの作成

毎日実行され、MySQL データベースに LOAD DATA INFILE を実行する cron スクリプトがあります。Web アプリケーションの一部として PHP を使用して、過去 7 日間に挿入されたレコードの合計数を示す週次レポートを生成したいと考えています。

これを実行する最善の方法を知りたいです。MySQL にパッチを当てたり変更したりすることはできず、データの挿入方法を変更することもできません。このデータを PHP に読み込むのは面倒なので、挿入前に CSV ファイルを数えるのは避けたいと思います。

提案はありますか?

答え1

PHP アプリ内でなければなりませんか? cron スクリプト内で、挿入する行数をカウントし、それをログファイルまたは mysql データベース内の小さなログ テーブルに追加できます (mysql を変更するという意味でない限り)。よくわかりませんが、myql 関数 row_count() は INFILE データでも機能するので、数をカウントするのは簡単だと思います。

そして、おそらく最も簡単な方法は、挿入後に行が変更されていない場合、データベースにタイムスタンプ列を追加して、挿入の日付に自動的に設定し、1 週間の数字を count() することです。

答え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 データベースから取得できます。

SELECT Table_name,SUM(Table_rows) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in ('table1','table2');

このスナップショットを 1 日に 1 回取得する簡単な cron ジョブを作成すれば、PHP からそのデータを有用な方法で抽出するのはかなり簡単になります。データベース テーブルに保存することもできます ;-)

関連情報