我们正在运营广告网络并且最近遇到了一些性能问题。
制表问题的表格是表格"点击"列:
click_id int
,affiliate_id int
,campaign_id int
,country_id int
,time datetime
。
我们所有的Reads和Inserts在WHERE子句中都有country_id。
事实上,来自一个国家/地区的点击总是会阻止其他所有国家/地区的完整表格。这不是必要的,并且会大大降低我们的表现。
亲爱的MySQL专业人士,我是否理解将country_id上的点击表分区对我们来说是一个很好的解决方案?
中读到过它但我不确定哪种分区类型适合我们的需要。
你会推荐哪一个?为什么?
答案 0 :(得分:0)
请勿使用PARTITION
,因为您认为它可能会加快速度。它赢了。
只有4个案例(我知道)PARTITIONing
将加速一个系统。我的blog详细介绍了丢弃的旧版本#34;数据作为有用案例之一,另外提到其他3。
我希望您的country_id
是2字节"国家/地区代码"而不是4字节INT
。
那是一个click_id
?
通常,高流量计数器(例如,点击计数器)应该在一个单独的表中,可能只有一个id和一个计数器。这样可以减轻庞大的主表的负担并避免某些类别的锁定。
我可以看到 no 用于country_id上的分区。
" 7天加上'年龄'" - 这有问题。明天你会想要将一天的数据转移到 big " old"划分。这涉及REORGANIZE PARTITION
,它将复制所有"更早的"过度。太慢,并阻止整个表。我已经这样做了,但我必须确保有一个"维护窗口"在此期间,我可以做到。
我们所有的Reads和Inserts在WHERE子句中都有country_id。
让我们看一些典型的SELECTs
。他们总是有GROUP BY day
吗?如果是这样,那么可能需要每天的汇总表。这将极大地卸载Fact表上的SELECT
活动,并将其移动到更小,更好的索引摘要表中。 another blog