有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 上面的索引。