簡體   English   中英

在MySQL的同一數據庫中復制表的一部分

[英]Replicate part of a table in the same database in MySQL

我在MySQL(5.0版)數據庫中有一個大表(幾百萬行),該表中的數據插入頻率很高。

還有一些針對數據庫執行的僅需要最新數據(即最新的10000行)的select語句,頻率較低,有沒有辦法創建一個表,該表將保留主表中的數據副本並動態添加新行每當在主表中添加新行時(我可以定期刪除舊數據,這樣就不會有太大問題),而不會對主表造成太大影響。

如果可能的話,我還希望索引第二張表中的行略有不同。

聽起來您應該使用觸發器

大表上需要三個觸發器:

  • 插入后,對於每一行,您需要將新行復制到較小的表中,並從較小的表中刪除最舊的行
  • 更新后,對於每一行,您需要檢查該行是否在較小的表中,如果存在,則對其進行相同的更新
  • 刪除后,對於每一行,您需要檢查該行是否在較小的表中,如果存在,則將其刪除。

例如:

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中的視圖尚未實現,因此通常不會獲得任何性能上的好處(這聽起來就是您想要的),並且無法將視圖的索引與視圖所在的表的索引不同基於。

您可以使用將在父級更新的情況下更新的VIEWS ,也可以使用TRIGGERS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM