MySQL分区表到普通表互转

由于最近总有人抱怨,数据迁移后执行SQL变慢,经过查看原来是分区导致的问题。原分区根据按月设置RANGE分区,

看到这图的时候也许有人就会发现问题.......

业务查询SQL:

从SQL上看 执行计划确实是走了分区,但为什么没有命中索引呢,在图1的里有联合索引(idx_reportDate_groupID_shopID_saasOrderKey)

 

##解决问题思路

 

1、若强制指定走索引,确实是快的,扫描的行数也扫了

扫描二维码关注公众号,回复: 8767214 查看本文章

但由于业务修改比较麻烦,被要求要和其他库统一索引,继续不管....找问题先......

 

解决问题2:

 

   猜测可能是表统计信息和碎片引起的,通过dump 还原操作,结果还是一样没解决问题......

 

解决问题3:

 

  SQL查询1号到10号跨的时间段比较长,难道是优化器问题.....理论了解不多....继续找问题

 

  先把SQL 简单化查询操作 如select * from ....操作

发现效果还不错,此时修改查询时间范围。按业务查询的SQL看看

发现问题了,按理应该是在P27分区,怎么扫了这么多分区,这就能和第1图定义的分区有关系了,定义分区出了问题,到这算真正找到问题了。

 

开始解决问题:

 

目前应该想着怎么对3000W 表重构分区,而且不能删除原来数据都要保留着

 

方法1:

 

对于小表执行ALTER 操作:alter table table_name remove partitioning;  ##移除分区,锁表

 

线上可以使用pt-osc工具来移除分区,不影响业务

 

pt-online-schema-change -u load_data -h 192.168.21.113 -p root123 -P 3306 --alter=" REMOVE PARTITIONING" D=test,t=tbl_saas_order_food --charset=utf8 --no-version-check  --statistics --critical-load="Threads_running:200" --max-load="Threads_running=25" --print --execute

 

发现一移除分区查询瞬间变快

图索引刚加,在没这个索引 也可使用令一索引

 

重构分区:

 

小表自行alter table tabe_name PARTITION BY range(sid)(PARTITION p1512 VALUES LESS THAN (20160101),

 

 PARTITION p1601 VALUES LESS THAN (20160201),.........,PARTITION p888666 VALUES LESS THAN MAXVALUE)

 

大表:PT-OSC,如图

重构分区后,执行计划

其他验证,是否指定分区:

发布了447 篇原创文章 · 获赞 71 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/w892824196/article/details/103976958