Yeh*_*sef 6 mysql database-design sharding
我们有一个mysql跟踪数据库,有~100M行.我们通常会针对特定操作,独特访问等逐日运行查询.问题是由于索引的相互作用,查询生成月度报告的速度变慢(我们对日期进行范围扫描,然后基于多个查询其他领域.)
为了提高性能,我们已根据日期切换到工会,以避免范围扫描,性能更好.因此提出了这样的想法:或许我们应该每天用不同的表格每天分片.优点似乎是:
有没有人听说过或试过这种方法?有任何可预见的问题吗?
注意:我们正在考虑其他noSQL方法 - 但是如果我们决定继续使用MySQL,我们想知道这是否是一种有效的方法(所以请不要建议"尝试XYZ noSQL DB").另外,我知道我们可以得到一台更好的机器,而且在数据集的范围内,这并不是那么大 - 但我们不想在较大的机器上浪费钱,如果一个较小的机器可以工作而没有太多额外的工作.
看来你可以看看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;
Run Code Online (Sandbox Code Playgroud)
分区解决方案在概念上与您的相同,但 RDBMS 将为您处理许多方面。