mysql表设计,大列大小与大行数

时间:2012-10-26 05:42:17

标签: mysql

请帮助我了解以下哪项更适合扩展和性能。

Table: test
columns: id <int, primary key>, doc <int>, keyword <string>

我想要存储的数据是指向包含特定关键字的文档的指针

设计1:

have unique constraint on the keyword column and store the list of documents as an array
e.g id: 1, doc: [4,5,6], keyword: google

设计2:

insert a row for each document  
1 4 google  
2 5 google  
3 6 google 

让我们说一个特定关键字的平均文件数接近100000.关键字可能没有最大数量的文件。

3 个答案:

答案 0 :(得分:0)

许多因素会影响扩展和性能,因此在开发早期尝试优化未知数通常不是一个好主意。

对于数据库设计,我发现通常最好采用更正确的规范化方法(您的设计2),然后担心扩展和性能(如果它成为问题)。然后,您可以根据您面临的问题对某些区域进行去标准化或采取其他方法。

由于无法将doc列与另一个表一起加入,您的设计选项1可能会立即遇到其他问题,以及更新和搜索它的复杂性。

答案 1 :(得分:0)

设计1可能受MySQL's row size limit限制。

设计2对我来说最有意义。如果您需要删除其中一个值,该怎么办?您只需删除一行而不必搜索并更新数组。这也很好,因为它允许您在必要时限制结果的大小(例如,用于分页)。

您还可以考虑在此表与关键字表之间创建多对多关系,而不是将关键字存储为字段。

答案 2 :(得分:0)

你可以忘记选项1,因为mysql中没有数组数据类型。

老实说,如果你想为这类数据提供可扩展的解决方案,我认为你应该研究一种不同类型的数据库。更多关于NoSQL和'键值对存储数据库'的研究。

使用mysql,我能想到的最好的选择是你的第二个选项,除了你应该创建另一个带有数字ID和唯一关键字列表的表。这样,当您进行搜索时,您将首先查找ID,然后按ID而不是字符串过滤大表。数字比较比字符串比较更快。