在MySQL中的同一数据库中复制表的一部分

时间:2009-10-08 13:09:57

标签: mysql optimization

我在MySQL(5.0版)数据库中有一个大表(数百万行),它以非常频繁的速率插入数据。

对数据库执行的select语句也不那么频繁,只需要最新的数据(即最新的10000行),有没有办法创建一个表来保存主表中的数据副本并动态生成每当在主表中添加新行时添加新行(我可以定期删除旧数据,这不是太大的问题),而不会对主表造成太大影响。

如果可能的话,我还希望第二个表中的索引行略有不同。

2 个答案:

答案 0 :(得分:2)

听起来你应该使用triggers

大表上需要三个触发器:

  • 在INSERT之后,对于每一行,您需要将新行复制到较小的表中并从较小的表中删除最旧的行
  • 更新后,对于每一行,您需要检查该行是否在较小的表中,如果是,请对其进行相同的更新
  • AFTER DELETE,对于每一行,您需要检查该行是否在较小的表中,如果是,请将其删除。

例如:

DELIMITER //
CREATE TRIGGER after_insert AFTER INSERT ON big_table
FOR EACH ROW
BEGIN
    DECLARE small_table_rows INTEGER;
    INSERT INTO small_table (field1, field2) VALUES (NEW.field1, NEW.field2);
    SELECT COUNT(*) INTO small_table_rows FROM small_table;
    IF small_table_rows > 10000 THEN
        DELETE FROM small_table ORDER BY id ASC LIMIT 1;
    END IF
END;//
DELIMITER ;

DELIMITER //
CREATE TRIGGER after_update AFTER UPDATE ON big_table
FOR EACH ROW
BEGIN
    UPDATE small_table
    SET field1 = NEW.field1, field2 = NEW.field2
    WHERE small_table.id = NEW.id;
END;//
DELIMITER ;

DELIMITER //
CREATE TRIGGER after_delete AFTER DELETE ON big_table
FOR EACH ROW
BEGIN
    DELETE FROM small_table WHERE small_table.id = OLD.id;
END;//
DELIMITER ;

这是相当简单的,但如果表有很多列,触发器可能会变得难以处理。您可能想要考虑MyISAM与InnoDB的性能特征; InnoDB可能会提供更好的整体性能,具体取决于您运行的查询类型。

您不想使用视图; MySQL中的视图没有实现,因此您通常不会获得任何性能优势(这听起来像您想要的那样),并且您将无法以不同于视图的表的方式索引视图。基于

答案 1 :(得分:1)

如果父级更新或您可以使用,则可以使用VIEWS更新 TRIGGERS