首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL的同一数据库中复制表的一部分

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

Stack Overflow用户
提问于 2009-10-08 13:09:57
回答 2查看 180关注 0票数 0

我在一个MySQL (Version5.0)数据库中有一个很大的表(几百万行),其中的数据以非常频繁的速度插入其中。

还有一些不太频繁的针对数据库的select语句,只需要最新的数据(即最新的10000行),有没有办法创建一个表,它将保留主表中的数据副本,并在向主表添加新行时动态添加新行(我可以定期删除旧数据,因此这不是一个太大的问题),而不会对主表造成太大影响。

如果可能的话,我也想索引在第二个表稍微不同的行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-08 13:16:46

听起来你应该使用triggers。

您需要在大桌子上使用三个触发器:

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

例如:

代码语言:javascript
复制
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中的视图没有具体化,因此您通常不会获得任何性能优势(这听起来就是您想要的),并且您不能以不同于视图所基于的表的方式对视图进行索引。

票数 2
EN

Stack Overflow用户

发布于 2009-10-08 13:21:21

您可以使用在父级更新时将更新的VIEWS,也可以使用TRIGGERS

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1537701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档