在应用程序中存放临时数据,临时表似乎是一个很好的选择,内存表在主从数据库上表现则不那么好。
原因很简单,无论是基于STATEMENT还是基于ROW复制,都要在二进制日志中包含改变的数据。这就要求在主从机上数据必须一致。当重启从库的时候,你就会丢失内存表的数据,复制中断。
这时应该怎么处理呢?
1.使用Innodb表代替innodb表非常快,能满足我们对性能的需求。
2.在复制中忽略内存表如果不是非常有必要的话,忽略复制内存表,使用这个选项replicate-ignore-table=db.memory_table。我们需要注意的是:STATEMENT复制,不要使用insert ... select 添加数据到内存表。如果要使用insert ... select,从机上的表将会是空的,甚至某些时候,内存表根本不会复制到从机上。还有一种解决办法是在主从机上都部署上相同的计划任务,来刷新这个表。
3.谨慎重启从机从长远角度考虑我不会使用内存表,作为解决方案。
以上内容翻译自:
http://www.mysqlperformanceblog.com/2010/10/15/replication-of-memory-heap-tables/
此外还有关于如果真在工作中使用了内存表,并且重启了从机上的MySQL,还想和主机上的MySQL保持数据同步的话,这里有一个解决方案。
http://forge.mysql.com/tools/tool.php?id=163