第43期:多表关联场景下如何用好分区表

本文探讨了在不同场景下使用MySQL分区表进行表关联时的性能影响。通过具体案例对比了分区表与普通表在多种查询条件下的表现,揭示了合理利用分区表提升查询效率的关键。

如何在多表关联场景下合理利用分区表来提升查询性能?基于前几篇关于分区表的介绍,想必大家对 MySQL 分区表的认知已经非常全面:分区表存在的目的就是为了减少每次检索的数据量从而提升整体性能。

前几篇介绍了基于分区表的单表应用,那么分区表在多表关联时是否有必然的性能提升? 经常有人会问这样的一些问题:我用了分区表,但是查询一点也没有加快,反而更慢了,是什么原因?是不是分区表本身有缺陷?还是我没有理解分区表适合的场景?对于这些个问题,我今天用几类典型的查询场景来举例说明。

第一种场景:两表关联,关联键是分区键,但是没有过滤条件。

类似这样: select * from t1 inner join t2 using(id);

这类场景用分区表只会让查询性能更差,并不会加速查询性能。

不用分区表时,表关联数目只有两张;用了分区表,参与表关联的表数目就不仅仅是两张,还有众多表分区,分区数目越多,查询性能越差。

举个简单例子:表t1 为哈希分区表,有1000个分区,记录数50W行。

localhost:ytt>show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int DEFAULT NULL,
  `r1` int DEFAULT NULL,
  `r2` int DEFAULT NULL,
  `log_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
/*!50100 PARTITION BY HASH (`id`)
PARTITIONS 1000 */
1 row in set (0.00 sec)

表 t1_no_pt 为普通表,为表t1的克隆,但是移除掉表分区,记录数也同样为50W条。

localhost:ytt>show create table t1_no_pt\G
*************************** 1. row ***************************
       Table: t1_no_pt
Create Table: CREATE TABLE `t1_no_pt` (
  `id` int DEFAULT NULL,
  `r1` int DEFAULT NULL,
  `r2` int DEFAULT NULL,
  `log_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
1 row in set (0.00 sec)

这两张表在这种场景下的查询性能对比: 分区表和普通表关联查询,执行时间为6.76秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值