我有一个巨大的表,存储许多跟踪事件,例如用户单击。
这张桌子已经有上百万台了,而且它每天都在变大。当我尝试从一个大的时间框架中获取事件时,查询开始变慢,在阅读了相当多关于这个主题的内容之后,我了解到对表进行分区可能会提高性能。
我想要做的是每月对表进行分区。
我只找到了一些指南,说明如何每月手动分区,是否有一种方法可以让MySQL按月进行分区,并且它会自动进行分区?
如果不是,考虑到我的分区by列是一个日期时间,手动执行它的命令是什么?
发布于 2013-10-14 07:44:41
如手册所解释:http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html
这很容易通过散列分区的月份输出。
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):
ALTER TABLE ti
PARTITION BY HASH( MONTH(tr_date) )
PARTITIONS 6;查询可以在整个表中同时完成:
SELECT * from ti;或来自特定分区:
SELECT * from ti PARTITION (HASH(MONTH(some_date)));发布于 2020-11-24 11:57:29
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)发布于 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)中产生相同的变化。
https://stackoverflow.com/questions/19355024
复制相似问题