
如何在多表关联场景下合理利用分区表来提升查询性能?基于前几篇关于分区表的介绍,想必大家对 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秒。

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

被折叠的 条评论
为什么被折叠?



