3

データベースに挿入された新しいレコードを数える最も簡単な方法は何ですか? ロード クエリにカウント クエリを含めることはできますか?

それとも、既存の最後のレコードを記録し、その後に追加されたすべてのレコードをカウントするなど、より複雑なものが必要ですか?

編集:

mysql に直接渡されるスクリプトで LOAD DATA INFILE を使用する cron ジョブがあります。このデータは、php Web アプリケーションで使用されます。PHP Web アプリケーションの一部として、先週挿入されたレコード数を含む週次レポートを生成する必要があります。

mysql にパッチを適用したり、データベースのスキーマや構造を大幅に変更したりすることはできませんが、新しいテーブルやフィールドを追加することはできます。csv ファイルからレコードをカウントせず、この結果をテキストファイルなどに保存したいと思います。代わりに、クエリを使用して PHP 内からすべてを行うことを好みます。

4

14 に答える 14

2

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

トリガーを使用すると、カウント情報を別のテーブルに保持する必要があります。基本的に、カウントを保持するには、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

于 2009-07-06T15:01:02.290 に答える
1

特定のテーブルを表示していない場合は、次を使用できます。

 show global status like "Com_%";

これにより、すべてのタイプのクエリの統計が表示されます。これらの数値は数え続けるだけなので、使用する場合は、クエリの追跡を開始するときに最初の数値を記録し、これを最終的な数値から減算します(ただし、これは当然のことです)。

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

于 2009-07-07T22:05:38.767 に答える
1

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

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

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

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

于 2009-06-30T14:11:43.510 に答える
0

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

于 2009-07-11T04:15:05.747 に答える
0

これはあなたが望むよりも簡単かもしれませんが、行数を追跡するためのNagiosモニターはどうですか?(serferfault.comで質問することも検討してください。これは完全に彼らの路地にあります。)

于 2009-07-11T04:23:36.043 に答える
0

どこからデータをロードしますか?それらをデータベースに挿入する前に、それらを数えることを検討するかもしれません。sqlscriptの場合は、フィールドをカウントするための迅速でダーティなbashスクリプト(grepなどを使用)を作成できます。

于 2009-07-06T14:31:41.947 に答える
0

徹底的な情報が必要な場合は、どの行が挿入、更新、または削除されたか、タイムスタンプ付きでそれらを格納するための追加の監査テーブルを作成することが理にかなっている場合があります。これはトリガーを使用して行うことができます。また、イベントとして実行され、古いエントリ(古いと見なされるものは何でも)を消去するストアドプロシージャを作成します。

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

Paul Dubois(2nd Edition)の「MySQLCookbook」の655ページ、またはJoeCelkoの「SQLforsmarties」の158ページを参照してください。

于 2009-07-13T07:57:04.003 に答える
0

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

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

使用している mysql のバージョンはわかりませんが、バージョン 5.0 でトリガーを作成するための構文へのリンクは次のとおりです: http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

幸運を、

マット

于 2009-07-13T07:50:04.610 に答える
0

おそらく、データベースに行数を照会する小さなシェル スクリプトを作成できます。その後、毎分/時間/日などに実行され、COUNT をログ ファイルに出力する Cron ジョブを作成できます。時間の経過とともに、ログ ファイルを確認し、データベースが増大する速度を確認できます。ログ ファイルに日付も入れておけば、長期間にわたって簡単に確認できます。

于 2009-07-11T08:52:59.680 に答える
0

「ロード」はテーブルに新しいデータを挿入するだけですか?またはテーブル全体を書き直しますか?

新しいデータをロードする場合は、次のことができます

select count(*) from yourtable
ロード前に 1 回、ロード後に 1 回 ... 違いは、挿入された新しいレコードの数を示します。

一方、テーブル全体を書き直し、以前のバージョンとは異なるレコードを見つけたい場合は、まったく異なるアプローチが必要になります..

どちらですか ?

于 2009-07-13T10:56:08.137 に答える
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-で (クリーンな mysql ディレクトリ ソースに適用するための) MySQL パッチを提供しています。 5.0.37.patch.gz。パッチの詳細については、http://code.google.com/p/google-mysql-tools/wiki/Mysql5Patchesを参照してください。

これがあなたの求めているものでない場合は、より適切なサポートを提供するために、もう少し詳しく説明することをお勧めします。

于 2009-07-11T09:42:25.273 に答える
0
show global status like 'Com_insert';

flush statusshow session status...現在の接続だけで機能します。

http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html#statvar_Com_xxxを参照してください。

于 2009-07-15T15:22:27.210 に答える
0

最も簡単な方法を求められたので、挿入時にトリガーを使用することをお勧めします。単一列、単一行のテーブルをカウンターとして使用し、トリガーで更新できます。

于 2009-07-28T18:02:13.223 に答える
0

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

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

sobbayi の回答で述べたように、テーブルに「create at」タイムスタンプを追加すると、特定の時間の後 (または前) に作成されたレコードをクエリできます。

更新: 前後にカウントを取得するために必要なことは次のとおりです: カウント用のテーブルを作成します:

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 テーブルには、ロードの前後のカウントが含まれます。

于 2009-06-30T14:28:15.130 に答える