我的任务是从数据库中删除在操作过程中未受影响的所有实体。我创建了一个单独的表,它有两列,第一列表示表的名称,第二列表示该表中记录的id。
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然后,我需要删除所有未受影响的实体( ids不在edited_entities表中),并执行以下操作:
delete from puppy where id not in
(select ee.id from edited_entities ee where ee.table= 'puppy');我想知道对于这种操作最好的引擎是什么(MySql)?默认的数据库引擎是InnoDB。我考虑过内存(堆),但我不确定它是否可以加快删除操作。
如果你有建议,我如何才能优化所需的操作,我将很高兴在这里。
我不想在puppy表中添加额外的列。
发布于 2011-01-25 20:15:03
内存将更快,因为它不必在事务结束时写入磁盘。在本例中,我首先尝试BTREE,而不是散列索引,因为它允许您使用部分复合索引,就像磁盘上的表一样。
还可以尝试为insert和delete操作准备语句:在处理之前分别准备一条语句,然后使用相关参数进行调用。它可能更快,因为它不需要解析SQL;但在某些情况下,整个系统会变得稍微慢一些,因为它们占用了大量的内存。
另一种选择是实验性的“HandlerSocket”特性,它可以在Percona server等MySQL的几个分支中使用,它允许您将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表,将你的“tokeep”集合存储在同一台服务器上的NoSQL上,最后执行以下操作:
DELETE FROM puppy WHERE id NOT IN ($SMEMBERS tokeep:puppy );哈哈!
https://stackoverflow.com/questions/4793111
复制相似问题