mysql 分区的字段 与 where 的条件有什么样的关系啊
有2个表part_tab和no_part_tab,里面都有1000W数据-----------c1(id)|c2(类型1-10)|c3(日期)--------------...
有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、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么? 展开
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个回答
2014-01-06
展开全部
1、为什么没加索引时,两个表执行的记录数一样,难道分区的字段c3一定要包含在where条件里分区才生效吗?
对的.
因为 你分区, 还是不分区。 where c2='1'
最后结果都是 “全表扫描”
对于 分区的表, 意味着每一个分区的每一行, 就要扫描到, 才知道是否满足 where c2='1' 的条件。
对于 未分区的表, 就是这个表的每一行,都要扫描到了。
2、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么?
你这个分区表上面的索引, 我估计是局部索引。
也就是 当 where c3=... and c2= ... 的时候, 能够达到最好的效果。
当只有 where c2 = ... 的时候。
先要依次判断每一个分区, 然后在那个分区里面去 使用索引。
所以资源消耗, 要比那个 不分区的表, 要高一些。
对的.
因为 你分区, 还是不分区。 where c2='1'
最后结果都是 “全表扫描”
对于 分区的表, 意味着每一个分区的每一行, 就要扫描到, 才知道是否满足 where c2='1' 的条件。
对于 未分区的表, 就是这个表的每一行,都要扫描到了。
2、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么?
你这个分区表上面的索引, 我估计是局部索引。
也就是 当 where c3=... and c2= ... 的时候, 能够达到最好的效果。
当只有 where c2 = ... 的时候。
先要依次判断每一个分区, 然后在那个分区里面去 使用索引。
所以资源消耗, 要比那个 不分区的表, 要高一些。
追问
那个分区是不是只有where c3="..."的时候才管用啊
追答
对的, 如果检索条件里面, 是 c3=xxx and c2 = yyy
那么第一种情况下。
分区的表, 只需要查询1个分区。
不分区的表, 需要全表扫描。
那么第二种情况下。
分区的表, 只需要 查询1个分区 的 c2 上面的索引。
不分区的表, 需要全表的 c2 上面的索引。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询