我计划在表格中做很多INSERT DELAYED
事情MyISAM
。但是这些表可能还不存在。例如,假设每天都会存在一个新表。
因此,与其检测我的客户端中没有表并创建然后重试插入,这似乎是存储过程(“函数”)的一个很好的例子。
这可能吗?它会是什么样子?这种方法有什么缺点吗?
我计划在表格中做很多INSERT DELAYED
事情MyISAM
。但是这些表可能还不存在。例如,假设每天都会存在一个新表。
因此,与其检测我的客户端中没有表并创建然后重试插入,这似乎是存储过程(“函数”)的一个很好的例子。
这可能吗?它会是什么样子?这种方法有什么缺点吗?
创建一个每天晚上午夜前运行的计划事件并为第二天创建日志表不是一个想法。这样您就可以始终依赖于在任何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 执行该作业。