gpt4 book ai didi

mysql - 按日期分片跟踪表有缺点吗?

转载 作者:可可西里 更新时间:2023-11-01 06:49:53 28 4
gpt4 key购买 nike

我们有一个约 1 亿行的 mysql 跟踪数据库。我们通常按天对某些操作、唯一访问等进行查询。问题是由于索引的相互作用,查询生成月度报告的速度越来越慢(我们对日期进行范围扫描,然后基于多个查询其他领域。)

为了提高性能,我们改用基于日期的联合来避免范围扫描,并且性能要好得多。所以提出了一个想法,也许我们应该每天使用不同的表进行分片。优点似乎是:

  • 快速插入 - 每天 table 都是新的/小的,所以它总是很快。
  • 删除旧数据很简单(不需要从 100M 行的表中删除 5M 行,我们可以只删除一个表)
  • 我们目前的方法是无论如何都进行联合 - 所以我们只是联合不同的表而不是来自一个表的不同值。

有没有人听说过或尝试过这种方法?是否有任何可预见的问题?

注意:我们正在考虑其他 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;

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

关于mysql - 按日期分片跟踪表有缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25707996/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com