是否有按日期分片跟踪表的缺点?

时间:2014-09-07 07:19:37

标签: mysql database-design sharding

我们有一个mysql跟踪数据库,有~100M行。我们通常会针对特定操作,独特访问等逐日运行查询。问题是由于索引的相互作用,查询生成月度报告的速度变慢(我们对日期进行范围扫描,然后基于多个查询其他领域。)

为了提高性能,我们已根据日期切换到工会,以避免范围扫描,性能更好。因此提出了这样的想法:或许我们应该每天用不同的表格每天分片。优点似乎是:

  • 快速插入 - 每天桌子都是新的/小的所以它总是很快。
  • 删除旧数据很简单(不是从100M行表中删除5M行,我们只需删除一个表)
  • 我们目前的做法无论如何都在做工会 - 所以我们只是在一张桌子上合并不同的表而不是不同的值。

有没有人听说过或试过这种做法?有没有可预见的问题?

注意:我们正在考虑其他noSQL方法 - 但是如果我们决定继续使用MySQL,我们想知道这是否是一种有效的方法(所以请不要建议“尝试XYZ noSQL DB “)。另外,我知道我们可以得到一台更好的机器,而且在数据集的范围内,这并不是那么大 - 但我们不想在较大的机器上浪费钱,如果一个较小的机器可以工作而没有太多额外的工作

1 个答案:

答案 0 :(得分:2)

您似乎可以查看MySQL Partitioning

通过分区,您可以根据您可以根据需要进行设置的规则在文件系统中分发单个表的各个部分。实际上,表的不同部分作为单独的表存储在不同的位置。用于完成数据划分的用户选择规则称为分区函数,在MySQL中可以是模数,与一组范围或值列表的简单匹配,内部散列函数或线性散列函数。根据用户指定的分区类型选择该函数,并将用户提供的表达式的值作为其参数。此表达式可以是列值,作用于一个或多个列值的函数,或一组一个或多个列值,具体取决于所使用的分区类型。
在您的情况下,似乎在日期的月份部分的哈希分区可能是有用的。

CREATE TABLE Mydata (id INT, amount DECIMAL(7,2), tr_date DATE)
    ENGINE=INNODB
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 12;

分区解决方案在概念上与您的相同,但RDBMS将为您处理许多方面。