2012-06-26 52 views
3

我有一個表,存儲每週觀看統計爲大約40K企業,表通過2.2M記錄,並開始放慢速度,我正在尋求分區,以加快速度但我不確定如何做到最好。分區與主鍵和concatonated唯一索引的MySQL表

我的ORM需要一個id字段作爲主鍵,但該字段與數據無關,我一直在字段上使用一個唯一索引來表示年份,週數和業務ID。因爲我需要主鍵參與分區映射,所以我不確定如何最好地組織這個(我以前從未使用過分區)。

目前,我有......每週

CREATE TABLE `weekly_views` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `business_id` int(11) NOT NULL, 
    `year` smallint(4) UNSIGNED NOT NULL, 
    `week` tinyint(2) UNSIGNED NOT NULL, 
    `hits` int(5) NOT NULL, 
    `created` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    UNIQUE `search` USING BTREE (business_id, `year`, `week`), 
    UNIQUE `id` USING BTREE (id, `week`) 
) ENGINE=`InnoDB` AUTO_INCREMENT=2287009 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ROW_FORMAT=COMPACT CHECKSUM=0 DELAY_KEY_WRITE=0 PARTITION BY LIST(week) PARTITIONS 52 (PARTITION p1 VALUES IN (1) ENGINE = InnoDB, 
PARTITION p2 VALUES IN (2) ENGINE = InnoDB, 
PARTITION p3 VALUES IN (3) ENGINE = InnoDB, 
PARTITION p4 VALUES IN (4) ENGINE = InnoDB, 
(5 ... 51) 
PARTITION p52 VALUES IN (52) ENGINE = InnoDB); 

一個分區似乎打破他們的唯一合乎邏輯的方式。我是正確的,當我使用'business_id = xx和week = xx和year = xx'搜索當前周/業務的記錄時,它會知道使用哪個分區而不搜索所有分區?但是,當我得到結果並通過ORM保存時,它將使用id字段並且不知道使用哪個分區?

我想我可以使用自定義查詢來插入或更新(我最初並沒有這樣做,因爲ORM不支持它)。

我對此有正確的看法,還是有更好的方法來分割這樣的表格?

感謝您的幫助!

+0

分區是一種內部機制,您不必擔心或更改插入/更新查詢。 – georgecj11

回答

0

只要查詢在WHERE子句中有week列,MySQL就會查找正確的分區。但是,每週重複數週,最終會得到同一分區中不同年份的數據。

你還需要53個不是52個分區,因爲你需要處理閏年。