私はテーブルにたくさんのことINSERT DELAYED
をすることを計画しています。MyISAM
ただし、テーブルがまだ存在しない可能性があります。たとえば、毎日新しいテーブルが存在するとします。
したがって、クライアントにテーブルがないことを検出して作成し、挿入を再試行する代わりに、ストアド プロシージャ (「関数」) の適切なケースのように思えます。
これは可能ですか?それはどのように見えるでしょうか? このアプローチに欠点はありますか?
私はテーブルにたくさんのことINSERT DELAYED
をすることを計画しています。MyISAM
ただし、テーブルがまだ存在しない可能性があります。たとえば、毎日新しいテーブルが存在するとします。
したがって、クライアントにテーブルがないことを検出して作成し、挿入を再試行する代わりに、ストアド プロシージャ (「関数」) の適切なケースのように思えます。
これは可能ですか?それはどのように見えるでしょうか? このアプローチに欠点はありますか?
毎晩午前 0 時前に実行されるスケジュールされたイベントを作成し、翌日のログ テーブルを作成することは考えられません。INSERT
そうすれば、何かが起こる前にテーブルが作成されることに常に頼ることができますか?
CREATE EVENT createLogTable
ON SCHEDULE EVERY 1 DAY
STARTS '2010-6-20 23:59:00'
DO
BEGIN
SET @tablename = CONCAT('my_logging_table-',DATE(DATE_ADD(NOW(),INTERVAL 1 DAY)));
SET @query = CONCAT('CREATE TABLE IF NOT EXISTS`',@tablename,'` (`timestamp` INT,`event` VARCHAR( 20 )) ENGINE = MYISAM');
PREPARE createStatement FROM @query;
EXECUTE createStatement;
DEALLOCATE PREPARE createStatement;
END
テーブルが存在するかどうかを挿入ごとに確認するのは時間の無駄のようです。日ごとのテーブルが必要な場合(私の意見では、データベースで通常見られるロジックの多くに逆らいます。そのため、避けようとします):
別のアプローチは、MERGE テーブル ( http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.htmlを参照) で、毎日の cronjob が「今日の」テーブルを作成し、テーブルリストを更新します。 alter table ステートメントを使用したマージ テーブルの場合。
同じことを達成するための良い計画を立てるかもしれません。
たとえば、毎日作成されるテーブル「Logged_users」がある場合、users テーブルに列を追加するか、ID_USER、DAY列を含む追加のテーブルを作成することができます (これがより良い選択です)。次に、過去の日のすべての行を削除する CRON ジョブをプログラムし、そのジョブを毎日午前 12:00 に実行することができます。