首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按月划分MySQL表

问按月划分MySQL表
EN

Stack Overflow用户
提问于 2013-10-14 07:04:24
回答 4查看 40.1K关注 0票数 20

我有一个巨大的表,存储许多跟踪事件,例如用户单击。

这张桌子已经有上百万台了,而且它每天都在变大。当我尝试从一个大的时间框架中获取事件时,查询开始变慢,在阅读了相当多关于这个主题的内容之后,我了解到对表进行分区可能会提高性能。

我想要做的是每月对表进行分区。

我只找到了一些指南,说明如何每月手动分区,是否有一种方法可以让MySQL按月进行分区,并且它会自动进行分区?

如果不是,考虑到我的分区by列是一个日期时间,手动执行它的命令是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-14 07:44:41

如手册所解释:http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

这很容易通过散列分区的月份输出。

代码语言:javascript
复制
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
    ENGINE=INNODB
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 6;

请注意,这只是按月而不是按年划分,在本例中也只有6个分区(因此6个月)。

并对现有表进行分区(手册:https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html):

代码语言:javascript
复制
ALTER TABLE ti
    PARTITION BY HASH( MONTH(tr_date) )
    PARTITIONS 6;

查询可以在整个表中同时完成:

代码语言:javascript
复制
SELECT * from ti;

或来自特定分区:

代码语言:javascript
复制
SELECT * from ti PARTITION (HASH(MONTH(some_date)));
票数 21
EN

Stack Overflow用户

发布于 2020-11-24 11:57:29

代码语言:javascript
复制
CREATE TABLE `mytable` (
  `post_id` int DEFAULT NULL,
  `viewid` int DEFAULT NULL,
  `user_id` int DEFAULT NULL,
  `post_Date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
PARTITION BY RANGE (extract(year_month from `post_Date`))
(PARTITION P0 VALUES LESS THAN (202012) ENGINE = InnoDB,
 PARTITION P1 VALUES LESS THAN (202104) ENGINE = InnoDB,
 PARTITION P2 VALUES LESS THAN (202108) ENGINE = InnoDB,
 PARTITION P3 VALUES LESS THAN (202112) ENGINE = InnoDB,
 PARTITION P4 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
票数 4
EN

Stack Overflow用户

发布于 2021-02-04 21:26:31

注意通过散列进行分区的“懒惰”效果:

正如医生所说:

您还应该记住,每次插入或更新行(或可能删除)时都会对该表达式进行评估;这意味着非常复杂的表达式可能会导致性能问题,特别是在执行一次影响大量行的操作(例如批处理插入)时。

最有效的哈希函数是在单个表列上操作的函数,其值与列值的增加或减少一致,因为这允许对分区范围进行“剪枝”。也就是说,表达式随其所基于的列的值变化得越密切,MySQL就越能有效地使用该表达式进行哈希分区。

例如,如果date_col是DATE类型的列,则表示表达式TO_DAYS(date_col)与date_col值直接不同,因为对于date_col值的每一次更改,表达式的值都以一致的方式变化。表达式YEAR(date_col)相对于date_col的差异并不像TO_DAYS(date_col)的那样直接,因为并不是date_col中的每一个可能的变化都会在YEAR(date_col)中产生相同的变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19355024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档