1

我有一个在线服务(在线词汇培训师)。每个用户都有自己的词汇表。

现在,我不确定我应该如何构建我的 Mysql-DB。

据我所知,我有不同的可能性:

  1. 一个表中的所有内容(MyISAM):我将所有词汇存储在一个大型 MyISAM 表中,并添加一列“userid”来标识每个用户的词汇

  2. 每个用户都有自己的表(MyISAM):每次创建用户时,程序都会添加一个名为“vocabulary_{userid}”的表,其中 {userid} 是将表连接到用户。

  3. 一张表中的所有内容(InnoDB):与第一点类似,但使用 InnoDB 而不是 MyISAM。

问题是,一个大型词汇表可以达到 1 亿行。使用 MyISAM,问题是每个查询都会锁定整个表。所以我想,如果有很多用户在线(并发送很多查询),表可能会被锁定很多。对于 InnoDB,我根本不确定,这是否是一个很好的解决方案,因为我有相当多的 SELECT-、UPDATE- 和 INSERT- 命令。

我希望任何人都可以帮助我。先感谢您。

4

3 回答 3

3

使用InnoDB几乎总是更好。InnoDB 可以处理 1 亿行,最大大小为64tb。

听起来您没有关系数据集,而更像是键/值存储。也许Riak是一个更好的解决方案。

于 2012-12-28T21:52:19.367 回答
1

这取决于

如果您开始每个用户拥有一个表(也称为分片),那么一开始您会遇到一些麻烦。

如果你现在不需要规模。找一张索引好的表。我不会使用 MyISAM,而是使用 InnoDB,否则你可能会受到 MyISAM 最大问题的打击(锁......)

于 2012-12-28T21:52:38.860 回答
1

我认为,正常的关系设计将使用三个表:

  1. 用户 — 用户 ID 和其他属性:姓名、电子邮件等
  2. 词汇——问题中最不清楚的,但可能是具有词性和含义等属性的单词,可能包括单词 ID(因为某些单词拼写具有多种含义)。
  3. User_Vocabulary — 包含用户 ID、单词 ID 以及可能的属性(例如“学习日期”)的表格。

如果 MyISAM 在查询进行时锁定了表,那么如果您需要对 User_Vocabulary 表进行并发更新,那么您将无法使用 MyISAM。因此,所有表都使用 InnoDB。

于 2012-12-28T22:03:26.443 回答