我正在社交网站上工作,所以我希望用户会很多。 我需要为每个用户保存标签(关键|计数器),我想知道是否更好地使用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)什么是好的分裂指数?我使用了1000个(用户)后的短片
答案 0 :(得分:3)
2是正确的答案。考虑一下如何为每个用户维护一个表,或者每1000个标签维护一个表。您将如何创建/更新/删除表格?如果你必须进行大规模更改怎么办?您如何能够找出您需要选择哪个表?即使你可以,如果你需要同时从多个表中选择(例如,为两个用户获取标签),该怎么办。
将表拆分不会给你带来很多性能上的好处。确实,如果表变得非常大,插入可能会变慢,因为mysql必须创建密钥,但只要你有适当的密钥,查找就应该非常快。
另一个类似的解决方案是拥有一个标签表,一个用户表和一个映射它们的表。这将使标签基数保持较小,如果你使用两个表的auto_increment代理键,两者的密钥长度将很小,这应该尽可能快地查找,而不受关系的限制(即必须弄清楚)其他用户加入的其他表格。)
答案 1 :(得分:2)
使用选项2是处理此问题的正确方法。您仍然可以在表中使用分区。有关使用分区的所有信息都可以在MySQL documentation。
中找到每千个用户在分区中拆分表格如下所示:
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个分区中。查看链接以获取更多信息。