0

我在一个社交网络网站上工作,所以我希望用户会很多。我需要为每个用户保存标签(键 | 计数器),我想知道使用 1)大表与 2)一个非常大的表与 3)拆分的大表是否更好。

1)这是许多表实现的示例

表 userid_tags(每个用户都有自己的表)

key   | counter
-----   ---------
tag1  |   3
tag2  |   1
tag3  |   10

Query 1: SELECT * FROM userid_tags WHERE key='tag1'
Query 2: SELECT * FROM userid_tags

2)单表实现:

表格标签

key   | counter | user_id
-----   ------------------
tag1  |   3     | 20022
tag2  |   1     | 20022
tag2  |   10    | 31234

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022'
Query 2: SELECT * FROM userid_tags AND user_id='20022'

3)拆分表实现

表 1000_tags(user_id 从 1 到 1000)

key   | counter | user_id
-----   ------------------
tag1  |   3     | 122
tag2  |   1     | 122
tag2  |   10    | 734

表 21000_tags(user_id 从 20000 到 21000)

key   | counter | user_id
-----   ------------------
tag1  |   3     | 20022
tag2  |   1     | 20022
tag2  |   10    | 20234

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022'
Query 2: SELECT * FROM userid_tags AND user_id='20022'

3)什么是好的拆分索引的问题?我按照 instict 使用了 1000 个(用户)

4

2 回答 2

3

2是正确答案。想想您将如何为每个用户维护一个表,或者每 1000 个标签维护一个表。您将如何创建/更新/删除表?如果您必须进行大规模更改怎么办?您将如何确定需要从哪个表中进行选择?即使可以,如果您需要同时从多个表中进行选择(例如获取两个用户的标签),该怎么办。

拆分表不会给您带来太多性能优势。确实,如果表变得非常大,插入可能会变得更慢,因为 mysql 必须创建键,但只要您有适当的键,查找应该非常快。

另一个类似的解决方案是有一个标签表、一个用户表和一个映射它们的表。这将使标签基数保持较小,如果您对两个表都使用 auto_increment 代理键,则两者的键长度都会很小,这应该使查找尽可能快而对关系没有限制(即必须弄清楚其他表为其他用户加入)。

于 2013-03-16T17:22:52.907 回答
2

使用选项 2 是处理此问题的正确方法。不过,您仍然可以在表中使用分区。有关使用分区的所有信息都可以在MySQL 文档中找到。

为每千个用户将表拆分为分区如下所示:

CREATE TABLE tags (`key VARCHAR(50), counter INT, user_id INT)
    PARTITION BY KEY(user_id) partitions 1000;

如果user_id是 21001,您可以开始在正确的分区中搜索,例如:

SELECT * FROM tags PARTITION (p22);'

因为 id 21001 将在第 22 个分区中。检查链接以获取更多信息。

于 2013-03-16T17:37:14.147 回答