今天看到生产数据库中,其中一个日志表的数据超过130W,并且增长迅速。担心数据过大会影响CR效率(日志表,所以没有删除&更新),想到MYSQL的分区表。创建分区表后,可以将数据根据某一字段进行逻辑分区,为数据表创建多个数据文件,So....效率会高一些。还有个问题就是不影响业务逻辑,代码不用修改,那条数据查询那个分区表,都由MYSQL负责。。所以我就开始。。折腾了!
写在前面
创建分区表时,如果分区字段与主键字段不同,则遇到以下错误
[Err] 1503 - A PRIMARY KEY must include all columns in the table's partitioning function
解决方案1:将分区字段与主键字段作为联合主键,这显然不是正常逻辑,一般都是按照时间字段进行分区,那么时间+ID进行联合主键是什么鬼。所以我们还有个妥协方案
解决方案2:将主键删除,创建索引,加上自增属性,创建分区,Well done。
开始
删除主键,创建索引
alter table [table_name] drop primary key , ADD INDEX([primary key name]);
创建自增字段
ALTER TABLE [table_name] MODIFY COLUMN `[primary key name]` int(11) NOT NULL AUTO_INCREMENT FIRST ;
关键的来了!!
ALTER TABLE rpt_log PARTITION BY RANGE (to_days(receive_time)) (
PARTITION rpt_log_17_2 VALUES LESS THAN (to_days('2017-2-1')),
PARTITION rpt_log_17_3 VALUES LESS THAN (to_days('2017-3-1')),
PARTITION rpt_log_17_4 VALUES LESS THAN (to_days('2017-4-1')),
...
...
...
PARTITION rpt_log_max VALUES LESS THAN MAXVALUE);
PARTITION log_17_2 VALUES LESS THAN (to_days('2017-2-1')),
这一句表明,如果时间小于“2017-02-01”则放入“log_17_2”中,你也可以设定多个时间,到永远。。当然,如果永远还不够远怎么办?MAXVALUE来帮你
PARTITION log_max VALUES LESS THAN MAXVALUE)
那么这一句就不难理解,当超出设置时间,则放入“log_max”中。
语句执行成功了,那么如何验证是否成功呢?这里有个方法,进入MYSQL的DATA目录
可以看到,分区表都建立成功了,并且17_2/17_3已经有数据了。
具体效率怎么样,日后再说!!!
都是原创,有不对的地方,可以联系我,一起探讨。