簡體   English   中英

同步2個表:一個帶引擎=內存另一個帶引擎= InnoDB

[英]Sync 2 tables: one with engine = Memory another with engine = InnoDB

我有2個表,student_memory(engine = Memory)和student_innodb(engine = InnoDB)。 某個線程正在不斷更新student_memory(間隔為2秒)。 我必須同步兩個表(比如每隔10秒)。 我有一些方法:
1.通過查看2個表之間的差異並在student_innodb上運行這些查詢來創建插入/更新/刪除語句。
2.刪除student_innodb ,ALTER TABLE student_memory ENGINE = INNODB,RENAME TO student_innodb ;
3.截斷student_innodb表,然后插入student_innodbstudent_memory選擇*;

我正在使用第二種方法,因為這可以節省我比較表的行,創建INSERT/UPDATE/DELETE並執行它們。 但我不確定性能。 這些表中可以有大約1000-100000行。 誰能建議任何其他更好的解決方案或我應該使用哪一個?

要回答你的問題,可能最快的方法是在兩個表上都有某種主鍵(例如student_id)。 然后,您應該添加第三個內存表changed_students_memory,它只有一個student_id字段作為它的主鍵。

每當你改變students_table時,你應該:

INSERT (student_id) VALUES (:student_id) INTO changed_students_memory ON DUPLICATE KEY IGNORE

然后,您只需要在changed_students_memory中更新要更新的記錄列表。 然后,您可以更新您的innodb表:

BEGIN;

UPDATE
  student_innodb AS i
  JOIN student_memory AS m USING (student_id)
  JOIN changed_students_memory USING (student_id)
SET
  i.<fieldname1> = m.<fieldname1>,
  i.<fieldname2> = m.<fieldname2>... ;

TRUNCATE TABLE changed_students_memory;

COMMIT;

如果您只更新一小部分行,這將會快得多。 我還要提到的是,根據該假設,使用第三個表比將“臟”列添加到現有內存表並在其上添加索引更好,因為大多數情況下優化器不會使用索引,因為它不會認為它有足夠的選擇性。

說完了所有這些 - 我猜測如果你在內存表中做了所有這些瘋狂的事情,那么你的問題就會接近你的錯誤。 內存表並不意味着長時間存儲數據。 如果數據庫出現故障,您將丟失數據。 如果你有內存表作為性能優化,你最好調整你的INNODB設置。 如果配置正確,INNODB非常快。 我可以輕松處理來自數百個並發連接的負載。 如果給它足夠的內存,INNODB會將所有熱數據保存在內存中(請參閱my.cfg / my.ini中的innodb_buffer_pool_size)。

我知道這是一個老問題,但對於那些來自搜索引擎的人(比如我自己),我應該說:

永遠不要在上面的問題中實現任何解決方案,首先你可以獲得部分數據丟失,而另外兩個解決方案,你可能會丟失全部數據!

最好的方法是對innodb(或內存)執行INSERT / UPDATE / DELETE數據,並設置AFTER INSERT / AFTER UPDATE / AFTER DELETE觸發器來更新另一個表的內存。 所以,你永遠不會丟失數據,但不要忘記為INSERT / UPDATE / DELETE啟用Transaction!

這樣,您永遠不會丟失數據,並且從內存表中讀取數據的速度非常快。 內存表將始終自動同步到Innodb。

1最后一件事:不要忘記配置mysql在服務器啟動時自動同步這兩個表!

暫無
暫無

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

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