2011-01-25 50 views
0

我的任务是从数据库中删除在操作过程中不受影响的所有实体。我创建了一个单独的表,它有两列,第一个表示表的名称,第二个表是该表中记录的ID。选择Mysql引擎处理大型“类型值”表

CREATE TABLE edited_entities (
     table VARCHAR(50) not null, 
     id BIGINT(20) not null) 

例如,如果我有表

CREATE TABLE puppy(
     id BIGINT(20) not null, 
     name VARCHAR(20) not null) 

并在它的记录

id | name 
1 | Rex 

如果我编辑这个记录,我要把以下数据edited_entities:

table | id 
puppy | 1 

然后我需要删除Ë所有非受影响实体(其中ID是不edited_entities表),我也下:

delete from puppy where id not in 
    (select ee.id from edited_entities ee where ee.table= 'puppy'); 

我不知道什么是对这类操作(MySQL的)的最好的引擎?默认的数据库引擎是InnoDB。我想过内存(堆),但我不知道它是否可以加快删除操作。

如果您有建议,我该如何优化所需的操作,我会很高兴在这里。

我不想在小狗表中添加额外的列。

+0

不同的varchar大小不是故意的我猜? – 2011-01-25 11:54:35

回答

0

内存会更快,因为它不必在事务结束时进入磁盘。在这种情况下,我会尝试第一个BTREE而不是HASH索引,因为它可以让你使用部分复合索引,就像磁盘上的表一样。

另请尝试使用预处理语句进行插入和删除操作:在处理前准备其中一个,然后调用相关参数。它可能会更快,因为它不必解析SQL;但也有一些情况下整个系统的速度稍慢,因为它们占用的内存不是很重要。

另一种选择是实验性'HandlerSocket'功能,可用于MySQL的几种分支,如Percona server,它允许您访问MySQL表作为NoSQL存储,具有巨大的性能优势,但完全符合ACID。 (Percona人是性能狂热分子;即使你不能使用HandlerSocket,一定要测试他们的叉子)

最后,一个可行的(但更多的工作为你)选项是一个单独的内存数据库。我倾向于使用Redis,这是一个非常高速的内存键值存储,增加了“值”是有用的数据结构。在你的情况,你可以存储一组ID的每个表,像

tokeep:puppy => 1,4,6,76..... 

这是一个简单的(原子)操作的元素添加到组(SADD tokeep:puppy 76),并在年底你获取它们所有创建SQL DELETE WITH id NOT IN (...)操作

而且,我想到的最后一个选项(还有更多为您工作)将是将所有内容放在同一个存储区中:Redis的一个分支,以前称为redisql,但现在它是Alchemy Database;它将SQL表添加到Redis中,从而保持了NoSQL的大部分性能优势。所以,你可以有你的“常规”表作为炼金术SQL表,存储你的“随时注意”上设置的NoSQL在同一台服务器上,并在年底做:

DELETE FROM puppy WHERE id NOT IN ($SMEMBERS tokeep:puppy); 

巴姆!

+0

谢谢你的回答! – Zalivaka 2011-01-31 10:06:31