表的结构为:linkid varchar(30),
smsid int(4),
uptime datetime,
  
1 我想控制其表只保存最近1个小时的数据。这个如何做?2 如果这个需求不方便实现的话,也可以只保留我设置的一个最大记录数。比如我希望表内最多只保存3000条数据。看mysql文档说可以在CREATE TABLE语句中指定一个MAX_ROWS表选项。通过这个选项我是否可以使得记录数量只保留3000条?并且如果记录数量到达了3000条并不是无法继续插入数据了,而是会将时间最早的数据清除掉,就是类似栈的结构,使数据按顺序出栈?3 内存表的内存占用计算公式我查了mysql的手册,为SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)+ ALIGN(length_of_row+1, sizeof(char*))。但还是没看明白,请问我这样的表结构,如果有3000条数据的话大概占多少内存。谢谢

解决方案 »

  1.   

    1、在插入触发器中判断;
    示例:
    DELIMITER $$DROP TRIGGER /*!50032 IF EXISTS */ `zz`.`gg`$$CREATE
        /*!50017 DEFINER = 'root'@'localhost' */
        TRIGGER `zz`.`gg` AFTER INSERT ON `zz`.`bbb` 
        FOR EACH ROW BEGIN
    if (select count(*) from bbb)>9 then
    delete from bbb where cid=new.cid;
    end if;
        END;
    $$DELIMITER ;
    2、MAX_ROWS没有用;3、不建议用内存表,除非内存非常在,用临时表存储。
      

  2.   

    1.不能用触发器来实现!! 必须在插入前判断。
    2.MAX_ROWS现在还不起作用。
    3.内存表的大小是按照max_heap_table_size来计算的。表结构保存在磁盘上,占了很少的一部分。注意:临时表尽量少用。
      

  3.   

    首先谢谢楼上两位的建议,不过我最关心的问题是,数据是否可以像栈一样的结构,只保持最近1个小时或3000条数据。如果到达3000条数据,从最前面的数据开始出栈,然后后续的入库。以这种形式。我的mysql是5.0.45似乎不支持触发器。而且我最关心的问题是,使用触发器是否能另数据可以像栈一样的结构,只保持最近1个小时或3000条数据。如果到达1个小时了或到达3000条数据,从最前面的数据开始出栈,然后后续的入库。以这种形式。也就是说数据库中的数据只保存最新3000条的数据或最新1个小时的数据。楼上两位不建议我使用内存表而是临时表,不知是出于什么原因。我考虑使用内存表的原因是要求这个表返回数据的速度要相当快才行。这个表的数据到不是真的重要到不可或缺的地步,偶尔的服务器挂一下清空数据也是可以接受的。
      

  4.   

    5.0.45应该支持触发器,你可以测试一下,我是在MYSQL5.1下测试通过的
      

  5.   

    嗯,我明白你的意思,无论是用触发器还是程序实现,当数据等于3000时,就delete from tbl where id = min(datetime);
    然后插入数据。不过我感觉每次插入如果都加这么个判断的话有点不爽。不知道mysql内部有没有这种现成的栈结构。另外,如果是怕数据丢失的话,我觉得临时表似乎比内存表更容易丢失吧,临时表在mysql断开连接后就会丢失,虽然相比之下它更容易恢复一些。
      

  6.   

    不过我感觉每次插入如果都加这么个判断的话有点不爽。不知道mysql内部有没有这种现成的栈结构。呵呵,MYSQL没有
      

  7.   

    谢谢了两位,我想到办法了,只保留24小时内的数据,直接用crontab定时执行一个shell脚本,shell脚本调用一个sql删除24小时前的数据:delete from linkid where TIMESTAMPDIFF(HOUR,uptime,now()) > 24;