【问题标题】:MySQL stored procedure to INSERT DELAYED but CREATE TABLE first if needed?MySQL存储过程插入延迟但如果需要首先创建表?
【发布时间】:2010-06-16 19:43:36
【问题描述】:

我计划在MyISAM 表中做很多INSERT DELAYED。但是这些表可能还不存在。比方说,例如每天都会存在一个新表。

因此,与其检测我的客户端中没有表并创建然后重试插入,这似乎是一个存储过程(“函数”)的好案例。

这可能吗?它会是什么样子? 这种方法有什么缺点吗?

【问题讨论】:

    标签: mysql stored-procedures insert myisam


    【解决方案1】:

    每次插入检查表是否存在似乎是浪费时间。如果您需要逐日表格(在我看来,它们违反了数据库中通常存在的大部分逻辑,因此我会尽量避免使用它们):

    1. 创建默认表以插入“my_logging_table”。
    2. 对该表执行所有插入/更新/删除操作。
    3. 运行每日 cronjob 以创建昨天的表 ('my_logging_table-2010-06-15'),并将所有昨天的记录插入其中,然后将它们从主表中删除。
    4. 如果这对您的应用程序有很大的重写,您可以使用当前表名+日期 ('my_logging_table-2010-06-16') 创建一个可更新视图,该视图仅插入到 'my_logging_table' 中

    另一种方法是 MERGE 表(请参阅 http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html),每日 cronjob 创建“今天”表并使用 alter table 语句更新合并表的表列表。

    【讨论】:

    • 感谢您的回答。我实际上是建议先插入,然后仅在插入失败时处理表创建。我同意在每个 INSERT 上检查表格是非常浪费的!
    • 每日表格的目的是处理大量不断传入的数据。您的第 3 步将是非常数据密集型的,并且实际上每天都会使系统停止一次。这基本上是我想要避免的。
    • 如果是这样,我会走 MERGE 表路线并每天创建一个表并将其添加到合并表中(可能是唯一的表,MySQL 不会介意)。
    【解决方案2】:

    创建一个在每晚午夜前运行的计划事件并为第二天创建日志表不是一个想法。这样您就可以始终依赖在任何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
    

    【讨论】:

      【解决方案3】:

      你可以制定一个很好的计划来完成同样的事情。

      例如,如果您有一个每天都会创建的表“Logged_users”,您可以在 users 表中追加一列,或者创建一个带有 ID_USER, DAY 列的额外表(这将是一个更好的选择)。然后,您可以编写一个 CRON 作业以删除过去几天的每一行,并在每天凌晨 12:00 执行该作业。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 2011-06-02
        • 2016-11-09
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多