the*_*mix 5 mysql in-memory-database
我有2个表,student_memory(engine = Memory)和student_innodb(engine = InnoDB).某个线程正在不断更新student_memory(间隔为2秒).我必须同步两个表(比如每隔10秒).我有一些方法:
1.通过查看2个表之间的差异并在student_innodb上运行这些查询来创建插入/更新/删除语句.
2.删除student_innodb,ALTER TABLE student_memoryENGINE = INNODB,RENAME TO student_innodb;
3.截断student_innodb表并执行,插入student_innodbselect*from student_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
Run Code Online (Sandbox Code Playgroud)
然后,您只需在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;
Run Code Online (Sandbox Code Playgroud)
如果您只更新一小部分行,这会快得多。我还想提到,在这种假设下,使用第三个表比向现有内存表添加“脏”列并在其上添加索引更好,因为大多数时候优化器不会使用索引,因为它不会认为它有足够的选择性。
说了这么多 - 我猜如果你用内存表做所有这些疯狂的事情,那么你就错误地解决了你的问题。内存表并不意味着长期存储数据。如果数据库出现故障,您将丢失数据。如果你有内存表作为性能优化,你最好调整你的 INNODB 设置。如果配置正确的话,INNODB 是非常快的。我可以轻松处理来自数百个并发连接的负载。如果你给它足够的内存,INNODB 会将所有热数据保留在内存中(请参阅 my.cfg/my.ini 中的 innodb_buffer_pool_size )。