2012-02-06 3 views
1

私はElasticSearch(フルテキスト検索)でMySQLテーブルのインデックスを作成しています。作成時に新しい行を送信する代わりに、そのテーブルの新しいレコードに対してN秒(約30秒)ごとにSQLクエリを実行します。PRIMARY_ID> lastProcessedIdを常に照会してデータベーステーブルを「監視」するのは悪いですか

SELECT * FROM myTable where id > lastProcessedId 

私の質問:私たちは、最後に処理されたレコードのID(AUTO_INCREMENT)を格納するなど、クエリを発行していることをやる、これはこれを処理するための良い方法ですか?重大な欠点はありますか?より良い選択肢はありますか?

また、ユーザーの好み(Facebookのスタイル)を扱うために同じアプローチを使用する予定でした。 N秒ごとに最新の「好き」を取得して処理し、各ユーザーのタイムラインを更新するSQLクエリを実行します。

私たちは古いコードベースを混乱させるのを避けるために、このようにしています。しかし、私は毎秒このタイプのクエリーを発行することにはあまり慣れていません。

このソリューションに関するご意見や問題はありますか?

+0

アプリケーションがトランザクションをどのように処理したかによって、2つのトランザクションが同時に複数のレコードをINSERTすると、SELECTはいくつかのレコードを見逃す可能性があります。後続のSELECTは、より低いすべてのIDを見たと誤って判断します。 – pilcrow

答えて

0

高価に聞こえますが、私は他のアプローチを考えます。

  1. 古いコードを変更して、挿入時に索引を付けます。私はそれが恐ろしいかもしれないことを知っていますが、それはそれが悪いですか? :)
  2. 何とか再インデックスプロセスを開始する挿入トリガーを作成します。私はあなたがこれをどのように構築するためのオプションがたくさんあると思います。

チェックアウト、http://www.roseindia.net/sql/trigger/mysql-trigger-after-insert.shtml

+0

インデックス作成はMySQLの外で行われますが、その場合挿入トリガーが役立つかどうかわかりません。 –

+0

はい、弾性検索でインデックスを作成するにはhttpが必要です。私はそれをやったことはありませんが、mysqlに新しいネイティブ関数を追加する可能性があります。 http://dev.mysql.com/doc/refman/5.0/ja/adding-native-function.html – Andy

0

それは少し高価だが、それが唯一の30秒ごとだ場合、それは痛みを伴う得るために始めたまでは率直に言って、私はそれをそのようにしてください。

データベースを介してステージングするのではなく、データを後で取り込んで処理する場所があります。シリアライズされたコピーをファイルに追加したり、30〜60秒ごとに新しいファイルを作成したり、スクリプトで前の未処理ファイルを処理したりするなどの単純な操作を使用できます。同様に、他の種類のキューに入れてから、実行することができます。

関連する問題