2015-12-03 37 views
0

我們正在經營廣告網絡,並且最近有一些性能問題。在我的情況下,哪個MySQL分區是正確的?

表格中的問題是表 「點擊」 的列: click_id intaffiliate_id intcampaign_id intcountry_id inttime datetime

我們所有的閱讀和插入在WHERE子句中都有country_id。

事實上,來自一個國家的點擊總是會阻止每個其他國家的完整表格。這不是必要的,並且會降低我們的表現。

尊敬的MySQL專業人士,我有理解我們是否瞭解在country_id上對點擊表進行分區對我們來說是一個很好的解決方案?

mysql manual

讀到它,但我還沒有確定哪個分區類型是適合我們的需要。

你會推薦哪一個,爲什麼?

+0

取決於您對該表執行的查詢。但最有可能按日期劃分 - 您可以輕鬆地移除/歸檔舊項目。 – Marki555

+0

您如何看待爲每個國家劃分分區的想法? – Benjamin

+0

甚至是國家分銷?如果一半數據是例如美國你不會從國家分配中獲得太多收益。 – Marki555

回答

0

不要僅僅因爲你認爲它可能會加快速度而使用PARTITION。它不會。

只有4例(我知道)PARTITIONing將加速系統。我blog封面,詳細,下落的「舊」數據的有用情形之一的,再加上提到的其他3

我希望你country_id爲2個字節的「國家代碼」,而不是一個4字節INT

這到底是click_id

一般來說,高流量的計數器(例如點擊計數器)應該放在一個單獨的表中,可能只不過是一個id和一個計數器。這會消耗更大的主表,並避免某些類別的鎖。

我可以看到用於在country_id上進行分區。

「7天加'老'」 - 這是一個問題。明天你會想把一天的價值數據移動到大的「較舊」的分區。這涉及到REORGANIZE PARTITION,它將複製所有「較舊」。太慢,並阻止整個桌子。我已經這樣做了,但我必須確保有一個「維護窗口」,在此期間我可以做到這一點。

我們所有的閱讀和插入都在WHERE子句中有country_id。

讓我們來看一些典型的SELECTs。他們總是有一個GROUP BY day?如果是這樣,那麼每天的彙總表可能是有保證的。這將大大減輕Fact表上的SELECT活動並將其移動到更小,更好的索引摘要表。 another blog

相關問題