【问题标题】:Autmatically create table on MySQL server based on date?根据日期在 MySQL 服务器上自动创建表?
【发布时间】:2010-03-09 19:49:42
【问题描述】:

对于 MySQL,是否有等效于 cron 的方法?

我有一个 PHP 脚本,可以根据月份和年份查询表,例如:

SELECT * FROM data_2010_1

到目前为止,我一直在做的是,每次脚本执行时都会查询表,如果存在,则执行工作,如果不存在,则创建表。

我想知道是否可以在 MySQL 服务器本身上设置一些东西,以便在每月第一天的午夜创建表(基于默认表)。


更新

根据我获得的 cmets,我认为这不是实现目标的最佳方式。所以这里还有两个问题:

  1. 如果我有一个每月添加数千行的表,这可能会拖累资源吗?如果是这样,那么划分这个表的最佳方法是什么,因为上面是禁止的?

  2. 我最初想出的本土方法有哪些潜在问题?

【问题讨论】:

  • 请不要那样做。严重地。请。
  • 这让我想知道为什么您根据日期有不同的表格。我假设每个表的每一行都有一个日期,那么为什么不将所有数据保留在同一个表中呢?
  • @avpx :由于应用程序每月为每个用户写入几十行,这是为了避免使用一个巨大的表来存储所有信息。我应该使用推荐的方法吗?
  • @Jonathan S:为什么不呢?你的紧迫感让我觉得我遗漏了一些明显的东西。非常欢迎任何帮助,包括最佳实践。
  • re 为什么不呢:因为很多桌子不如一张大桌子。 SQL 旨在处理大表。 SQL 不太擅长处理很多小表。

标签: sql mysql database-design cron data-modeling


【解决方案1】:

如果我有一个每月添加数千行的表,这可能会拖累资源吗?


如果您进行每月表拆分,则行数相同。数据库处理 数百万 行 - 这不是问题。

我最初想出的本土方法有哪些潜在问题?


首先会很痛苦,加入 12 个表只是为了总结一年中的详细信息与一个表。需要更多的基础设施和维护来确保记录在正确的表中。

【讨论】:

    【解决方案2】:

    相反,如果一个表具有月份和年份列,或者更好的是您可以查询的时间戳。

    【讨论】:

      【解决方案3】:

      查看自 MySQL 5.1 起可用的 Event Scheduler:

      http://dev.mysql.com/doc/refman/5.1/en/events.html

      【讨论】:

        【解决方案4】:

        您最初的“计划表创建”的目标是什么?您是否担心将所有数据保持在线?也许您出于某种安全原因想删除上个月的数据?

        如果您确实需要将月份分开,那么您的“计划表创建”想法存在同步问题。将活动安排在午夜并不能保证它会在午夜准确执行。那么,如果计划的创建恰好发生在早起的用户盲目地执行期望当前表存在的查询之后的几分之一秒,您会怎么做?因此,将空表创建与查询保持在同一位置是一个更好的主意。

        好的,您可以在午夜之前安排创建。但是,如果为将来的日期在网上有一张空表不成问题,为什么不提前一两年手动创建表呢?

        【讨论】:

          【解决方案5】:

          如果我有一张包含数千个 每月添加的行,这是 可能会拖累资源?如果 那么,最好的分区方法是什么 这个表,因为上面是 禁止吗?

          当然它会使用资源,因为您将数据/信息添加到数据库中。与拥有不同的表相比,它对资源的拖累并不大 - 它应该更少 - 因为每个表都有与维护表相关的开销。

          分区问题

          我不认为它是“分区”,但这完全取决于您的数据以及您如何使用数据。在任何 SQL 系统中,您都可以基于列或列组合进行预索引。当您预先编制索引时,您基本上是在“分区”。因此,如果您知道您将在大部分时间根据日期(例如月/年)查看数据,那么您可以在日期字段上添加一个索引。从抽象的角度来看,这是对日期的数据进行分区。您创建的索引取决于您将如何使用数据 - 创建的越多,用于维护索引的时间/空间就越多,但使用索引的语句的性能越快。

          【讨论】:

            【解决方案6】:
            UPDATE pageviews SET 
                    yesterday = CASE WHEN last_update_time > xxx_ts THEN yesterday ELSE today END,
                    today     = CASE WHEN last_update_time > xxx_ts THEN today + 1 ELSE 1     END, 
                    acc = acc + 1, last_update_time = UNIX_TIMESTAMP() WHERE page_id = 'xxx';
            

            http://tech.shreeni.info/2010/01/conditional-mysql-statements-lifesaver.html

            facebook.com/zahoor80

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 2021-12-11
              • 1970-01-01
              • 2020-08-28
              • 2013-05-19
              相关资源
              最近更新 更多