Mysql 如何同步相同的innodb和只读myisam表

Mysql 如何同步相同的innodb和只读myisam表,mysql,Mysql,我计划有两个相同的表,一个在innodb中,另一个在myisam中。innodb表用于写入和更新,myisam表仅用于读取 将myisam表与innodb表同步的最佳方式是什么?解决方案不必是实时的。如果我能每天同步一次,那就足够了 我在论坛中搜索,有人建议插入表格选择*从表格\u只读。但这是一张有数百万行的大桌子。我需要5个小时才能完成插入 还有更好的建议吗 为什么这样奇怪的设置?除非您有一个高度多线程的环境,否则这两个引擎之间的性能没有太大差异 二, 为什么不使用更新后和插入后触发器 也许实

我计划有两个相同的表,一个在innodb中,另一个在myisam中。innodb表用于写入和更新,myisam表仅用于读取

将myisam表与innodb表同步的最佳方式是什么?解决方案不必是实时的。如果我能每天同步一次,那就足够了

我在论坛中搜索,有人建议
插入表格选择*从表格\u只读
。但这是一张有数百万行的大桌子。我需要5个小时才能完成插入

还有更好的建议吗

  • 为什么这样奇怪的设置?除非您有一个高度多线程的环境,否则这两个引擎之间的性能没有太大差异
  • 二,

  • 为什么不使用更新后和插入后触发器

  • 也许实时解决方案是最好的选择(当然,它会降低每个操作的速度;但是,在您的情况下,它可能还可以),只需在工作表上定义插入/更新/删除后触发器,即可始终保持两个表的同步。如果您喜欢定期运行同步查询,恐怕在任何情况下都需要较长的时间。您可以按照建议的Mchl进行改进。如果您需要处理更新的记录,您可以这样做

    REPLACE myisamTable 
    INNER JOIN 
    ( 
       SELECT t1.* 
       FROM innoDbTable AS t1 
       LEFT JOIN myIsamTable AS t2 
       ON (t1.PK = t2.PK AND t1.field1 = t2.field1 AND t1.field2 = t2.field2 ... etc) 
      // join by all fields to detect changes. if field allows NULL, then instead of 'AND (t1.f1 = t2.f1)'
      // you need to write 'AND (t1.f1 = t2.f1 OR (t1.f1 IS NULL AND t2.f1 IS NULL))`
       WHERE t2.PK IS NULL
    )changes ON (myisamTable.Pk = changes.Pk)
    SET field1 = changes.field1, field2 = changes.field2 , //... etc
    

    请记住,您还需要处理已删除的记录(如果有的话)-应该再进行一次查询,将它们从只读表中删除。

    1。我测试了innodb。某些查询的读取速度明显慢于myisam。一些论坛人士建议这样设置。我觉得值得一试。2.非常感谢您的解决方案。它解决了一半的问题。另一半是某些行可能会被更新。这不仅仅是插入新条目的情况。我们也可以使用同样的概念进行更新吗?另一个解决方案是使用触发器。除非回滚InnoDB上的Inactive或UPDATE时会导致完整性问题(触发器已触发,MyIsam表不支持事务)
    REPLACE myisamTable 
    INNER JOIN 
    ( 
       SELECT t1.* 
       FROM innoDbTable AS t1 
       LEFT JOIN myIsamTable AS t2 
       ON (t1.PK = t2.PK AND t1.field1 = t2.field1 AND t1.field2 = t2.field2 ... etc) 
      // join by all fields to detect changes. if field allows NULL, then instead of 'AND (t1.f1 = t2.f1)'
      // you need to write 'AND (t1.f1 = t2.f1 OR (t1.f1 IS NULL AND t2.f1 IS NULL))`
       WHERE t2.PK IS NULL
    )changes ON (myisamTable.Pk = changes.Pk)
    SET field1 = changes.field1, field2 = changes.field2 , //... etc