1

這可能是一個奇怪的情況,但它只是浮現在我的腦海裏...
想象一下,我有一個每天需要100萬新行的數據庫表。表中有3列:id,值,日期。基於此描述的senario詢問數據庫表設計的建議

我想要做的行是根據日期加載所有行。

這裏涉及到一個問題:

對於這個表,我用它的方式的性質(我只需要抓住某一天行的名單),在性能方面,它創建一個新表具有相同的結構,但在日常的基礎上命名爲日期(即,創建名稱分別爲01Jan2014,02Jan2014,...的表格,每個表中有100萬條記錄)會利用將一個表和日期列中的所有行作爲索引?

感謝, 託尼

+0

是的。它是分片:http://en.wikipedia.org/wiki/Shard_(database_architecture) – aconrad

+0

你是在談論水平分區?說我使用MySQL;在創建表時必須完成分區,還是在分區填充了數百萬個數據後才能將分區添加到表中? –

回答

1

沒有必要建立多個表。您可以使用Partitioning定義一個表,因此它看起來是一個邏輯整體表,但在內部它被存儲爲具有相同結構的多個物理表。

CREATE TABLE a_database_table (
id INT AUTO_INCREMENT, 
date DATE NOT NULL, 
value TEXT, 
PRIMARY KEY (id, date) 
) PARTITION BY RANGE COLUMNS (date) (
    PARTITION p1 VALUES LESS THAN ('2014-01-01'), 
    PARTITION p2 VALUES LESS THAN ('2014-01-10'), 
    PARTITION p3 VALUES LESS THAN ('2014-01-20'), 
    PARTITION p4 VALUES LESS THAN ('2014-02-01'), 
    PARTITION pN VALUES LESS THAN (MAXVALUE) 
); 

由於數據獲得接近最後一個分區(甚至把它開始填充的最後一個分區後),你可以把它分解:

ALTER TABLE a_database_table REORGANIZE PARTITION pN INTO (
    PARTITION p5 VALUES LESS THAN ('2014-02-10'), 
    PARTITION pN VALUES LESS THAN (MAXVALUE) 
); 

分區的好處是,對一個查詢具體的一天將「修剪」它對錶的訪問,因此它只讀取一個相關的分區。如果你的查詢是關於一天的具體情況並且MySQL可以推斷出哪個分區包含你正在查找的行,則會自動發生。

+0

我在創建表格的那一刻必須配置分區嗎?或者我總是可以在創建表之後添加它,並且已經有行? –

+1

是的,您可以使用ALTER TABLE將未分區錶轉換爲分區表,即使其中包含大量數據。但數據越多,重組所需的時間就越長。 –