【问题标题】:Autopruning after a specified amount of row are created?创建指定数量的行后自动修剪?
【发布时间】:2010-05-09 05:16:28
【问题描述】:

基本问题,抱歉。基本上,我有一个脚本,每次有人访问该页面时都会创建一个 MySQL 条目。一个日志记录脚本。但是,我想让它在 100 次访问后自动修剪。

以伪代码为例:

if amount of rows > 100 { delete rows 1+ until amount of rows == 100 }

所以简而言之,每次100之后添加新行,都需要自动删除id最小的行(我的主键)。

【问题讨论】:

  • 这些 INSERT 发生的速度有多快?我们谈论秒、小时、天……吗?
  • 当然会有所不同,具体取决于一天中的时间,但在高峰时段的秒数和非时段的数分钟到数小时之间

标签: php mysql pruning


【解决方案1】:

另一个可能的选择是使用数据库 TRIGGERS (http://forge.mysql.com/wiki/Triggers)

在这种情况下可能有点矫枉过正,但每次插入一行时都会检查表。 一个例子(我没有测试过!):

创建触发器 prune_MyTable 在 MyTable 上插入之后 每一行 开始 声明 num_rows 整数; DECLARE minimum_id INTEGER;

SELECT COUNT(*) INTO num_rows FROM MyTable;

如果 num_rows > 100 那么 SELECT MIN(id) INTO minimum_id FROM MyTable 限制 100;

UPDATE MyTable DELETE WHERE id

结束如果; 结束$$

【讨论】:

    【解决方案2】:

    您很可能必须锁定表才能获得计数,然后删除“正确”数量的旧记录。因此,我宁愿将 SELECT 限制为 100 行,并在表中保留更多记录,即使它们是多余的。您仍然可以删除旧记录,例如每 x 小时执行一次 cron 作业或每英里 x 的随机概率:

    if ( 10 > rand(0, 8000) ) {
      LOCK TABLES foo
      SELECT COUNT(*) as cnt FROM foo
      if ( $cnt > 100 ) {
        $cnt -= 100;
        DELETE FROM foo ORDER BY id DESC LIMIT $cnt
      }
      UNLOCK TABLES
    }
    

    或类似的东西......

    (据我所知,DELETE 语句的 ORDER BY 和 LIMIT 子句是特定于 MySQL 的。最好记住这一点。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-09
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2017-07-08
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多