mysql性能一大表vs多表

时间:2013-03-16 17:06:01

标签: mysql database performance

我正在社交网站上工作,所以我希望用户会很多。 我需要为每个用户保存标签(关键|计数器),我想知道是否更好地使用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个(用户)后的短片

2 个答案:

答案 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个分区中。查看链接以获取更多信息。