2013-03-15 121 views
0

我想在保留表結構的同時在MySQL中對錶進行分區。根據列值對MySQL表進行分區。

我有一個專欄,'Year',根據這個專欄,我想分別將表格分成不同的表格。新表格將包含名稱,如'table_2012''table_2013'等。生成的表格需要完全按照源表中的所有字段。

我已經試過SQL腳本中的兩件,但沒有成功:

1.

CREATE TABLE all_data_table 
( column1 int default NULL, 
    column2 varchar(30) default NULL, 
    column3 date default NULL 
) ENGINE=InnoDB 
PARTITION BY RANGE ((year)) 
(
    PARTITION p0 VALUES LESS THAN (2010), 
    PARTITION p1 VALUES LESS THAN (2011) , PARTITION p2 VALUES LESS THAN (2012) , 
    PARTITION p3 VALUES LESS THAN (2013), PARTITION p4 VALUES LESS THAN MAXVALUE 
); 

2.

ALTER TABLE all_data_table PARTITION BY RANGE COLUMNS (`year`) (
    PARTITION p0 VALUES LESS THAN (2011), 
    PARTITION p1 VALUES LESS THAN (2012), 
    PARTITION p2 VALUES LESS THAN (2013), 
    PARTITION p3 VALUES LESS THAN (MAXVALUE) 
); 

任何援助將不勝感激!

回答

1

從我看到你想從一張大桌子上創建許多桌子。

我認爲你應該嘗試創建視圖。 由於從我關於分區的角度來看,它實際上是對該表的物理存儲進行分區,然後將它們分開存儲。但是如果你從頂部的角度來看,你會看到他們作爲一張桌子。

0

這是舊的,但看到它在分區搜索中出現高度排名,我想我會給可能打到這個頁面的人提供一些額外的細節。您在討論table_2012table_2013不是「MySQL分區」,而是「手動分區」。

分區意味着您有一個具有單個表名稱的「邏輯表」,後者在後臺分爲多個文件。如果你有幾百萬到幾十億的行,但通常你只搜索一個月,按年份/月劃分可以有很好的性能優勢,因爲MySQL只需要搜索包含你的年份/月份的文件正在搜索......只要您將分區鍵包含在您的WHERE中。

當您創建多個表,如table_2012table_2013時,您手動對錶進行分區,而不使用MySQL PARTITION配置進行分區。要在2012年手動分區表,請將所有數據放入2012表中。當您點擊2013年時,您將開始將所有數據放入2013年表格。你必須確保在2013年之前創建表格,否則它將無處可去。然後,當您在多年的時間查詢時(例如2012年11月至2013年1月),您必須在table_2012和table_2013之間進行聯合查詢。

SELECT * FROM table_2012 WHERE #... 
UNION 
SELECT * FROM table_2013 WHERE #... 

通過分區,此手動工作不是必需的。你做分區的初始設置,然後你把它當作一個表。不需要工會,在插入之前不檢查日期等。這使生活變得更容易。 MySQL處理搞清楚它需要查詢哪些表。但是,您必須確保查詢年份列,否則將不得不掃描所有文件。例如。 SELECT * FROM all_data_table WHERE Month=12將掃描Month = 12的所有分區。爲確保您只掃描需要掃描的分區文件,您需要確保在每個查詢中都包含分區列。

可能對分區產生負面影響......如果你有數十億行,並且你在表上做了一個ALTER TABLE來說 - 添加一列......它將不得不每隔一行更新一個很長的時間。在我目前爲之工作的公司,老闆不認爲值得花費時間來更新歷史上的十億行,因爲我們正在爲未來添加一個新列......所以這是我們進行手動分區的原因之一而不是讓MySQL去做。

免責聲明:我不是分區專家...所以如果我在這方面有任何問題,請告訴我,我會修復不正確的部分。

相關問題