在MySQL中创建内存和事务安全的表

时间:2013-01-12 04:44:00

标签: mysql memory innodb

我知道我应该使用engine=MEMORY在内存中创建表,并engine=INNODB使表事务安全。但是,我怎样才能实现这两个目标呢?我试过engine=MEMORY, INNODB,但我失败了。我的目的是快速访问表并允许多个线程更改表的内容。

3 个答案:

答案 0 :(得分:3)

您尚未说明上述目标。我猜你正在寻找好的表现,而你似乎也希望这个表是交易性的。你唯一的选择就是InnoDB。只要您将InnoDB配置为使用足够的内存来保存整个表(使用innodb_buffer_pool_size),并且同一服务器上的其他InnoDB表没有过大的压力,数据将保留在内存中。如果您担心写入性能(并再次禁止使用同一系统),可以通过设置innodb_flush_log_at_trx_commit = 0并禁用二进制日志记录来降低持久性,从而大幅提高写入性能。

对临时表使用任何类型的触发器都将是一个混乱的维护,并且不会在临时表上给你任何事务性的好处。

答案 1 :(得分:0)

您正在寻找一种方法来创建具有2个(或更多)引擎的表,这是使用mysql无法实现的。

但是,我猜你想要使用内存,因为你不认为innodb能够满足你的需求。我认为innodb非常快,可能已经足够了,但如果你真的需要它,我认为你应该尝试创建2个表:

table1 memory< - 这里是你做所有SELECT的地方

table2 innodb< - 在这里你将进行UPDATE,INSERT,DELETE等并添加一个TRIGGER,这样当更新这个时,table1会得到相同的修改。

答案 2 :(得分:0)

我知道有两种方法

第一路

创建一个临时表(这些存储在内存中,带有一个小差异,它们将在会话注销时被删除)

创建临时表示例(id int 引擎 = Innodb;

第二路

你必须创建两个表,一个是内存引擎,另一个是innodb或bdb

首先将所有数据插入innodb表,然后触发要复制到内存表中的数据

如果你想清空innodb表中的数据,可以使用相同的触发器

你也可以使用事件来实现这个目标