我有一个表,其中包含350万行销售数据(~4年)。
目前,我的一些查询(从php完成)需要6-15秒才能完成。(根据解释计划,索引是有用的)。我的下一步是对表进行分区,看看是否可以挤出更多的时间,而无需在应用程序的开发阶段升级硬件。
当查询表时,最多是一个整体,检索单个年份的数据,有时更精细,如QTR或月份。
当应用程序“发布”时,预计表中的数据将以每年大约900 000行的速度增长。
既然如此。我应该只划分我目前在数据库中持有的年数吗?假设这个数字可以在这条线上被改变。还是应该创建更多的分区?
导致我提出问题的思想是:如果我创建的分区比我多年多,那么查询将需要从多个分区获取数据,如果我的查询只需要从一个大得多的分区中选择数据,那么这种情况的性能会不会更差?
发布于 2016-02-17 06:55:08
不要使用PARTITION,除非您有可以从中受益的操作。让我们看看你的问题。你会清除“旧”数据吗?
经验法则:除非有超过一百万行,否则甚至不要考虑PARTITION。
经验法则:有20-50个分区;没有更多。
不要创建下个月的分区,直到您即将需要它。保留一个空的“未来”分区,以防您忘记创建下一个分区。
要获得真正的性能,请使用汇总表。
SHOW CREATE TABLE --可能会有一些简单的改变让事情变得更有效率。还提供了一个示例SELECT。
发布于 2016-02-16 22:26:26
我应该只划分我目前在数据库中持有的年数吗?
不是的。分区条件满足所有可能的情况。在你的例子中,让我们想象一下,你拥有2014到2016年的数据。您应该有"< 2015-01-01“、"< 2016-01-01”、"< 2017-01-01“、"<最大值”和."< 2018-01-01“(最后一次应该低于最大值)。原因是这样您就不必在条件满足时尽快创建下一个分区。这不会影响性能,因为这个分区将是空的,通常不会被视为检索数据的可能分区。
而且,提前拥有1、2或位置是完全正常的,因为您需要更少的维护时间,创建新的分区,并且不需要冒将数据从最后一个分区(< Max)移动到新分区的风险。
我也会考虑创建更小的分区,比如学期或三个月。但一年就足够了。
请记住,分区列应该是主键的一部分,更重要的是,所有查询都应该在它们的条件中使用分区列,或者mySQL需要在所有分区中搜索数据,这可能比没有分区时性能更低。
但我不知道您现在是否需要使用分区。350万行并不多,您可能会考虑在重构表之前对mysql进行一些调优。
https://dba.stackexchange.com/questions/129453
复制相似问题