处理单个或多个表中的数百万行?

时间:2011-07-22 21:19:18

标签: mysql

我正在寻找使用大型数据库(> 100GB)的人的一些经验。

基本上我有一个表存储系统发送的所有帐户的所有邮件。每周,我们得到aprox。新增了100万行。

此表开始出现一些查询问题。我理解如何正确优化查询并尝试不同的索引组合。但我觉得这对一张桌子来说太过分了。

其中一个使用范围条件的查询通常会杀死我们的数据库。

根据您的经验,将此表拆分为多个表(每个帐户一个表)是否更好?每个帐户都有自己的数据库,因此为此修改我们的软件并不难。

我想这可以解决远程查询的问题,特别适用于< 5k行。

4 个答案:

答案 0 :(得分:1)

我没有直接使用MySQL。我更像是一个SQL Server和Oracle人。但我确实知道MySQL有table partitioning,它打破了大表并将它们分布在各个文件中。您可以为分区设置规则以及它们如何工作。

您可以尝试做的另一个提示是将数据分成存档表。例如,在您的后端,如果您需要按日期搜索邮件,并且日期范围是否超过一定时间,那么您的后端会在存档表中进行搜索。否则,它会在主表中搜索。这将允许您存档旧消息。

答案 1 :(得分:0)

MySQL通常可以更快地处理多个表而不是一个表。如果您可以将数据拆分为多个部分(一个表中的用户,另一个表中每个用户的操作等),则通常会更快。需要注意的是,如果您决定将数据拆分为多个表,则必须将它们与ID一起连接起来。

一些有用的信息: http://dev.mysql.com/doc/refman/5.1/en/multiple-tables.html

答案 2 :(得分:0)

在MySQL中手动分区表有点像雷区。一般情况下,除非您可以将数据拆分为多个表,这些表包含不同的类型数据(即,具有完全不同的列集的表),否则通常最好添加索引到让您的查询运行得更快。例外情况是,当您的数据集真正变得足够大以至于单个数据库太多时,分片(跨服务器)将有所帮助。

答案 3 :(得分:0)

我不太明白,你说每个帐户都有自己的数据库,但是你是在考虑按帐号拆分成不同的表?

另一种选择,因为我没有看到有人提到它,是sharding。虽然这是一项伟大的技术,如果使用得当可以帮助扩展;当你越来越碎片时,响应时间会出现问题。此外,根据每个元组存储的数据量(每行没有任何连接),您可以使用规范化技术将字段拆分为单独的表。不知道你的数据库有多远,但只是一个建议。