簡體   English   中英

使用主鍵和concatonated唯一索引對MySQL表進行分區

[英]Partition MySQL table with primary key and concatonated unique index

我有一個存儲大約40,000個企業的每周觀看統計數據的表,這些表通過了2.2M記錄並開始減慢速度,我正在考慮將其分區以加快速度,但我不確定如何做到這一點。

我的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不支持它)。

我是否正確地對此進行了解決方案,還是有更好的方法來對這樣的表進行分區?

謝謝你的幫助!

只要查詢在WHERE子句中有week列,MySQL就會查找正確的分區。 但是,每年重復幾周,您將在同一分區中獲得不同年份的數據。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM