2017-07-07 315 views
1

我有一個表格,其中包含有關時間的信息,所以表格中有像年,月,日,小時等列。
表有數據跨年和相當大,所以我決定在這張桌子上做分區,並開始瞭解有關Mysql分區,但幾個問題。
如果有人能幫助我理解分區和索引如何一起工作,我將非常感激。索引如何與MySql分區表一起使用

  1. 如果我創建分區的年份列,並且在同一列上也有索引,分區和索引將如何一起工作?如果我只在年份列索引而表格沒有分區,它將如何影響性能?

Ex。 Sql:Select month, day, hour ... from time_table where year = '2017';

  1. 如果表具有分區在年份列上並且查詢過濾記錄在月份列和月列被索引。如何索引超過一個月的索引以及如何劃分一年會影響精選的效果

防爆SQL:Select year, month, day .... from time_table where month = '05';

+1

你是說你在年份列上有一個水平分區? –

+0

對不起,我感到困惑。是的,我正在嘗試創建水平分區。 – money

回答

2

分區分割表成,我們會說: 「子表」。每個子表本質上都是一個表,包含數據和索引。

當從表中選擇SELECTing時,首先要做的是決定哪個分區可能包含所需的數據。這是「分區修剪」,並使用「分區鍵」(顯然是year)。然後,使用適當的索引將選擇應用於相關的子表。在這種情況下,由於您已經修剪到年份,因此擁有INDEX(year, ...)是一種浪費。

由於您沒有在WHERE子句中指定year,因此您的示例選擇無法進行分區修剪。因此,它會查找所有分區,,並且會比分區表慢。

  • 除非您期望至少有一百萬行,否則不要使用分區。 (這將是很多年。)
  • 不要使用分區,除非你有一個用例,它會幫助你。 (顯然不是你的情況。)
  • 不要有日期時間的部分列,當它是那麼容易計算的部分:,MONTH(date)
  • 不要與低基數索引列;優化器最終會掃描整個表 - 因爲它更快。 (如:month='05'

如果你想備份的一步,說明你正在嘗試什麼來完成的,或許我們可以討論的另一種方法。

+0

感謝您的詳細解答。其實我正在創造大量記錄的報道。我將數據存儲在與'time'表(我知道如果使用分區時不能有外鍵)有關係的'summary'表中,因此我可以獲取特定年份的年份或月份的報告或所以。我的「摘要」表每年產生約100萬條記錄。根據你的評論,首先在分區表中檢查特定的「分區」,然後在該部分使用「索引」。 而不是檢查兩件事('分區'和'索引'),不會使用'索引'工作更快? – money

+0

正確。這是通常的說法,即分區對性能沒有幫助。 _summary_表有1M /年? –

+0

是的,我的彙總表每年產生大約100萬條記錄。 – money