mysql 分区的字段 与 where 的条件有什么样的关系啊

有2个表
part_tab和no_part_tab,里面都有1000W数据

c1(id)| c2(类型1-10) | c3(日期)

part_tab表用c3来分区

PARTITION p0 VALUES LESS THAN(1995),PARTITION p1 VALUES LESS THAN(1996),

然后
explain select count() from part_tab where c2=‘1’\G
rows: 997800
explain select count(
) from no_part_tab where c2=‘1’\G
rows: 997800
然后我给 c2加了索引
explain select count() from part_tab where c2=‘1’\G
rows: 1051383
explain select count(
) from no_part_tab where c2=‘1’\G
rows: 886953
问:
1、为什么没加索引时,两个表执行的记录数一样,难道分区的字段c3一定要包含在where条件里分区才生效吗?
2、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么?

答:
1、为什么没加索引时,两个表执行的记录数一样,难道分区的字段c3一定要包含在where条件里分区才生效吗?
对的.
因为 你分区, 还是不分区。 where c2=‘1’
最后结果都是 “全表扫描”
对于 分区的表, 意味着每一个分区的每一行, 就要扫描到, 才知道是否满足 where c2=‘1’ 的条件。
对于 未分区的表, 就是这个表的每一行,都要扫描到了。
2、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么?
你这个分区表上面的索引, 我估计是局部索引。
也就是 当 where c3=… and c2= … 的时候, 能够达到最好的效果。
当只有 where c2 = … 的时候。
先要依次判断每一个分区, 然后在那个分区里面去 使用索引。
所以资源消耗, 要比那个 不分区的表, 要高一些。

问:那个分区是不是只有where c3="…"的时候才管用啊
答:
对的, 如果检索条件里面, 是 c3=xxx and c2 = yyy

那么第一种情况下。
分区的表, 只需要查询1个分区。
不分区的表, 需要全表扫描。

那么第二种情况下。
分区的表, 只需要 查询1个分区 的 c2 上面的索引。
不分区的表, 需要全表的 c2 上面的索引。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值