2009-06-30 6 views
3

データベースに挿入された新しいレコードを数える最も簡単な方法は何でしょうか?ロードクエリにカウントクエリを含めることは可能ですか?mysqlの統計を収集する

既存の最後のレコードを記録し、それ以降に追加されたすべてを数えるなど、もっと複雑なものが必要ですか?

編集:

私はcronジョブを持って、MySQLへ直接渡されるスクリプトでは、LOAD DATA INFILEを使用しています。このデータは、PHP Webアプリケーションで使用されます。 PHP Webアプリケーションの一環として、先週にいくつのレコードが挿入されたかなど、毎週のレポートを生成する必要があります。

私はmysqlにパッチを当てることができない、またはデータベースのスキーマ/構造を大幅に変更することはできますが、新しいテーブルやフィールドを追加することができます。私はcsvファイルからレコードを数えずにこの結果をテキストファイルなどに保存したいと考えています。代わりに、PHPの中からすべてのことをクエリで行うことを好むでしょう。

答えて

1

これはおそらく、新しいものと判断される内容に依存します。過去5分間または10分間などにデータベースに入力されたエントリですか?それとも、特定のAuto IDを過ぎたレコードですか?

新しいものを特定する時間ベースの方法を検討している場合は、レコードが挿入された時刻を記録し、番号を取得するフィールド(おそらくdatetime型のフィールド)を持つことができます。

select count(*) from table where currentTime > 'time-you-consider-to-be-new'

あなたは時間を記録することによって、行きたくない場合は、自動インクリメントキーを使用して、単純に最後に挿入IDを追跡し、任意の時点で、その後に来るものを数えることができます窓。 1時間前にIDが10000だった場合、それ以来いくつかのレコードが挿入されています。 10000を超えるすべてのレコードを数え、最後の挿入IDを追跡し、必要に応じて繰り返す必要があります。

+0

ロードが実行されるたびに、ロードされたエントリは日付に関係なく新しいものとみなされます。 –

+0

"ロード"とは正確に何を意味しますか? SQLにLOADキーワードはありません。 INSERTを意味しますか? – defines

+0

mysqlにLOADコマンドがあります... –

0

あなたの質問は多少曖昧ですが、mysql c APIは "mysql_affected_rows"という関数を提供し、各クエリの後に呼び出して影響を受ける行の数を取得できます。挿入の場合は、挿入された行の数を返します。更新の場合は、where句に一致する行数ではなく変更された行数が返されることに注意してください。

多くのクエリを実行していて、挿入された数を知る必要がある場合、最も信頼性の高い方法は、おそらくクエリの前後にカウントを行うことです。

sobbayiさんの回答では、テーブルに「作成済み」タイムスタンプを追加すると、指定した時間後(またはその前)に作成されたレコードを照会できるようになります。

UPDATE:ここでOK はあなたが前と後にカウントを取得するために何をする必要があるかです: カウント用のテーブルを作成します。

create table row_counts (ts timestamp not null, row_count integer not null); 

スクリプト内の前に、次のとロード・ファイルの後を追加インラインクエリ:

insert into row_counts (ts,row_count) select now(),count(0) from YOUR_TABLE; 
load file inline...... 
insert into row_counts (ts,row_count) select now(),count(0) from YOUR_TABLE; 

row_countsテーブルには負荷がかかった前後にカウントされるようになりました。

+0

タイムスタンプフィールドの作成はオプションではありません。構造を変更することはできません。私はPHP内から負荷をかけないので、影響を受けた行はここで私を助けません。 –

+0

どのようにデータをロードしますか? – Craig

+0

csvファイルからデータを読み込む –

0

どこからデータをロードしますか?あなたはそれらをデータベースに挿入するためにそれらを数えることを検討するかもしれません。それがsqlscriptなら、フィールドを数えるために素早く汚いbashスクリプト(grepなど)を書くかもしれません。

+0

不正確な場合に備えて、以前よりも挿入後にカウントしたい –

+0

挿入スクリプトを実行すると、動作しないとエラーが発生します。エラーがなければ、番号は正しいです。テーブルにすでにデータがあり、このようにしたくない場合は、現在の挿入に特別なフィールドを追加するか、かなり複雑なストアドプロシージャを実行する必要があります。しかし、おそらく私が考えることができない何かがあります。しかし、Craigが上記のように質問したように、あなたの日付をどのように挿入したいかはかなり良い質問です。 – leo

+0

私は多くの場合、既存の設定のために可能な限りPHP内からやりたいと思います。 –

2

あなたがMysql 5以上を使用していると仮定すると、特定のテーブルに挿入すると起動するトリガを作成できます。 「挿入」トリガも「LOAD」コマンドで起動することに注意してください。

トリガを使用する場合は、カウント情報を別のテーブルに保存する必要があります。基本的には、1行/ 1列の新しいテーブルを作成してカウントを保持する必要があります。トリガーは、その値をロードされたデータ量で更新します。

トリガーに関するMySQLのマニュアルページはここにありますが、構文はかなり単純です。 http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

編集また

、データベース内のデータを保持したくない場合は、ストアドプロシージャ内で、あなたの「ロード」操作を行うことができます。これにより、ロードを開始する前とロードが完了した後で、テーブルでselect count()を実行することができます。ロード中に挿入された行の数を判断するには、結果の値を減算するだけです。

ここでは、手順に関するMySQLのマニュアルページです。 http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

+0

これを少し例を使って拡張できますか? –

1

あなたが特定のテーブルを見ていない場合は、以下を使用することができます。

show global status like "Com_%"; 

これはあなたのクエリの種類ごとに統計情報が表示されます。これらの数字は数え続けるので、使用したい場合は、クエリの追跡を開始するときに最初の番号を記録し、最後の数字から差し引いてください(ただし、それは与えられたものです)。

純粋な統計情報を探している場合は、MySQLプラグインでMuninを使用することをおすすめします。

+0

私はこれをPHPから呼び出して結果を保存し、レポートが生成されるたびに何とか使用するように保存しますか? –

+0

はい、その結果をmysqlに格納することさえできます!たとえば、毎日のように番号を記録し、その日に何回クエリが発生したかを調べるために複数の日数を引くだけです。 – Evert

+1

注意:サーバー上のすべての*データベースのすべての*クエリをカウントします。 – Eli

0

あなたは構造を変更できないと言います。つまり、挿入しているテーブルを変更できない、またはデータベースをまったく変更できないということですか?テーブルを追加できる場合は、タイムスタンプと読み込んでいるテーブルのキーの2列のテーブルを作成してください。あなたのcsvファイルを読み込む前に、それらの2つの列だけを持つ別のcsvファイルを作成し、メインのファイルの後にそのcsvを読み込みます。

+0

テーブルを追加できます。自動的に読み込まれる別のcsvファイルをどのように作成しますか? –

+0

は、プライマリcsvファイルの各行を読み込み、プライマリキーの列を取得し、2番目のcsvファイルに新しい行を追加するスクリプトを作成するだけです。週末にレポートを実行する場合は、キーを使用してこの2番目のテーブルでメインデータテーブルを結合します。つまり、各行にタイムスタンプを関連付けることができました。メインファイルでスクリプト/プログラム/ cronジョブが読み込まれた場合でも、2番目のファイルをロードする必要があります。 –

+0

dangit - "それはあなたができた"と言うべきです。 –

0

これは、あなたが望むより簡単かもしれませんが、行数を追跡するためにNagiosモニターはどうでしょうか?

0

おそらく、データベースに行数を問い合わせる小さなシェルスクリプトを書くことができます。その後、毎分/時/日などに実行されるCronジョブを作成し、COUNTをログファイルに出力することができます。時間が経つと、ログファイルを確認して、データベースの成長率を確認することができます。また、ログファイルに日付を入力すると、長期間にわたって簡単に確認できます。

0

これが興味のあるMySQLデータコレクションの種類であるかどうかを確認してください:http://code.google.com/p/google-mysql-tools/wiki/UserTableMonitoring

この場合、Googleはhttp://google-mysql-tools.googlecode.com/svn/trunk/mysql-patches/all.v4-mysql-5.0.37.patch.gzにMySQLパッチ(クリーンなmysqlディレクトリソースに適用する)を提供しています。パッチの詳細については、http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patchesをご覧ください。

これはあなたが探しているものでない場合は、私たちがあなたをより良くするためにもう少し説明することをお勧めします。

+0

mysqlのパッチ適用はオプションではありません。私の質問についてはっきりしていないことはわかりません。私は毎日実行されるcronスクリプトハットからLOAD DATA INFILEを使用し、PHPを使用して挿入されたレコードの週報を生成したいと考えています –

0

作成したテーブルに挿入するテーブルにトリガを使用できますか?構造にタイムスタンプがありますか?

期間の範囲で日付計算を使用して、必要な情報を見つけることができます。

は、私はあなたが使用しているのMySQLのバージョンを知らないが、ここでは、バージョン5.0でのトリガを作成するための構文へのリンクです:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

幸運、

マット

0

さて、あなたの場合どの行が挿入、更新、または削除されたかを網羅した情報が必要です。追加の監査表を作成して、タイムスタンプを使用してそれらのものを保管することは理にかなっています。あなたはトリガーでこれを行うことができます。また、イベントとして実行されるストアドプロシージャを記述し、古いエントリを削除します(古いものとみなします)。

MySQLでトリガーを作成する方法については、リマが投稿したリンクを参照してください。

Paul Dubois(第2版)の「MySQL Cookbook」の655ページまたはJoe Celkoの「SQL for smarties」の158ページを参照してください。

0

'load'は新しいデータをテーブルに挿入するだけですか?またはテーブル全体を書き換えますか?

それは新しいデータをロードする場合は、上の

select count(*) from yourtable
が一度ロードする前に、一度ロードした後...差が挿入された場所をどのように多くの新しいレコードを紹介します。..

の場合を行うことができますあなたは完全なテーブルを書き直して、の前のバージョンと異なるのレコードを探したいと思っています。

どれですか?

+0

これは正しいと思われます!私はロードを伴うテーブルに新しいデータを追加するだけで、何も書き換えません。レポートの結果を維持するために、カウントの結果を別のテーブルに保存するにはどうすればよいですか? –

0

を参照してください。単一の列、単一行の表をカウンターとして使用し、トリガーで更新することができます。