Mysql 同步2个表:一个带有engine=Memory,另一个带有engine=InnoDB

Mysql 同步2个表:一个带有engine=Memory,另一个带有engine=InnoDB,mysql,in-memory-database,Mysql,In Memory Database,我有两个表,student_memory(engine=memory)和student_innodb(engine=innodb)。某个线程正在不断更新student_内存(间隔2秒)。我必须同步这两个表(比如每隔10秒)。我有一些方法: 1。通过查看两个表之间的差异来创建insert/update/delete语句,并在student_innodb上运行这些查询。 2。删除student\u innodb,更改表student\u memoryENGINE=innodb,重命名为student

我有两个表,student_memory(engine=memory)和student_innodb(engine=innodb)。某个线程正在不断更新student_内存(间隔2秒)。我必须同步这两个表(比如每隔10秒)。我有一些方法:
1。通过查看两个表之间的差异来创建insert/update/delete语句,并在student_innodb上运行这些查询。
2。删除
student\u innodb
,更改表
student\u memory
ENGINE=innodb,重命名为
student\u innodb

3。截断
student_innodb
表并执行,插入
student_innodb
select*from
student_memory


我使用第二种方法,因为这样可以避免比较表的行、创建
INSERT/UPDATE/DELETE
并执行它们。但我对表演不太确定。这些表中可能有大约1000-100000行。有人能推荐其他更好的解决方案吗?或者我应该使用哪种解决方案?

要回答您的问题,最快的方法可能是在两个表上都有某种主键(例如学生id)。然后,您应该添加第三个内存表changed\u students\u memory,该内存表只有一个student\u id字段作为主键

每次更改学生表时,您应该:

INSERT (student_id) VALUES (:student_id) INTO changed_students_memory ON DUPLICATE KEY IGNORE
然后,您只有一个记录列表要在已更改的内存中更新。然后,您可以更新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;
开始;
更新
学生和我一样
使用(学生id)以m的身份加入学生内存
使用(学生id)加入已更改的学生内存
设置
i、 =M
i、 =M
截断表更改\u学生\u内存;
犯罪
如果只更新一小部分行,这将快得多。我还要提到,在这种假设下,使用第三个表比向现有内存表中添加“dirty”列并在其上添加索引更可取,因为大多数情况下,优化器不会使用索引,因为它认为它的选择性不够


说到这里,我猜如果你用内存表做这些疯狂的事情,你解决问题的方法是错误的。内存中的表不是用来长时间存储数据的。如果数据库关闭,您将丢失数据。若将内存表作为性能优化,那个么最好调整INNODB设置。如果配置正确,INNODB速度非常快。我可以轻松处理数百个并发连接的负载。如果您给INNODB足够的内存(请参阅my.cfg/my.ini中的INNODB\u buffer\u pool\u size),INNODB会将所有热门数据保留在内存中。

我知道这是一个老问题,但对于来自搜索引擎的人(比如我),我应该说:

永远不要实施上述问题中的任何解决方案,第一个解决方案可能会导致部分数据丢失,而另外两个解决方案可能会导致全部数据丢失

最好的方法是在innodb(或内存)上插入/更新/删除数据,并在插入/更新后/删除后设置触发器以更新另一个表的内存。所以,您永远不会丢失数据,但不要忘记为插入/更新/删除启用事务

这样,您就不会丢失数据,而且从内存表中读取数据的速度非常快。内存表将始终自动同步到Innodb one


最后一件事:不要忘记配置mysql,以便在服务器启动时自动同步这两个表

请问为什么不能同时添加两行,一行到
student\u内存
,第二行到
student\u innodb
,每2秒添加一行?是因为他们需要相同的ID吗?如果是这样,您可以在
student\u内存
上编写插入触发器,将完全相同的行插入
student\u innodb
让我们假设我有这样的要求。在将数据放入student_innodb之后,我正在读取它,对数据进行一些处理,生成一些值,然后将生成的值与读取的数据一起传输到其他地方。如果在处理生成的数据时在student_innodb之间插入行,则在将它们传输到其他地方时,将不一致。在处理数据时,您可以
从student_innodb
中选择max(主键列),并将其存储在某个变量中。然后在每一个下一个查询中添加where条件“primary\u key\u col如果id