首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择Mysql引擎来处理大的"type-value“表

选择Mysql引擎来处理大的"type-value“表
EN

Stack Overflow用户
提问于 2011-01-25 19:46:44
回答 1查看 121关注 0票数 0

我的任务是从数据库中删除在操作过程中未受影响的所有实体。我创建了一个单独的表,它有两列,第一列表示表的名称,第二列表示该表中记录的id。

代码语言:javascript
复制
CREATE TABLE edited_entities (
        table VARCHAR(50) not null, 
        id BIGINT(20) not null)

例如,如果我有一张表

代码语言:javascript
复制
CREATE TABLE puppy(
        id BIGINT(20) not null, 
        name VARCHAR(20) not null)

里面还有一条记录

代码语言:javascript
复制
id | name
1  | Rex

如果我编辑此记录,我会将以下数据放入edited_entities:

代码语言:javascript
复制
table | id
puppy | 1

然后,我需要删除所有未受影响的实体( ids不在edited_entities表中),并执行以下操作:

代码语言:javascript
复制
delete from puppy where id not in 
    (select ee.id from edited_entities ee where ee.table= 'puppy');

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

如果你有建议,我如何才能优化所需的操作,我将很高兴在这里。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-25 20:15:03

内存将更快,因为它不必在事务结束时写入磁盘。在本例中,我首先尝试BTREE,而不是散列索引,因为它允许您使用部分复合索引,就像磁盘上的表一样。

还可以尝试为insert和delete操作准备语句:在处理之前分别准备一条语句,然后使用相关参数进行调用。它可能更快,因为它不需要解析SQL;但在某些情况下,整个系统会变得稍微慢一些,因为它们占用了大量的内存。

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

最后,一个可行的(但对您来说更多的)选择是单独的内存中数据库。我倾向于使用Redis,它是一个非常高速的内存中键值存储,并增加了‘值’是有用的数据结构。在本例中,您可以为每个表存储一组ID,如下所示

代码语言:javascript
复制
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上,最后执行以下操作:

代码语言:javascript
复制
DELETE FROM puppy WHERE id NOT IN ($SMEMBERS tokeep:puppy );

哈哈!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4793111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档