mysql 分区的字段 与 where 的条件有啥样的关系啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 分区的字段 与 where 的条件有啥样的关系啊相关的知识,希望对你有一定的参考价值。
参考技术A 1、为什么没加索引时,两个表执行的记录数一样,难道分区的字段c3一定要包含在where条件里分区才生效吗?对的.
因为
你分区,
还是不分区。
where
c2='1'
最后结果都是
“全表扫描”
对于
分区的表,
意味着每一个分区的每一行,
就要扫描到,
才知道是否满足
where
c2='1'
的条件。
对于
未分区的表,
就是这个表的每一行,都要扫描到了。
2、加了索引后,未分区的表比分区的表执行的记录数还要少,这是为什么?
你这个分区表上面的索引,
我估计是局部索引。
也就是
当
where
c3=...
and
c2=
...
的时候,
能够达到最好的效果。
当只有
where
c2
=
...
的时候。
先要依次判断每一个分区,
然后在那个分区里面去
使用索引。
所以资源消耗,
要比那个
不分区的表,
要高一些。
MySQL分区
P226)MySQL分区的优点主要包括一下4个方面:
- 和单个磁盘或者文件系统分区相比,可以存储更多数据
- 优化查询。在Where子句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及SUM()和COUNT()这类聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果。
- 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据。
- 跨多个磁盘来分散数据查询,以获得更大的查询吞吐量。
分区类型:
- range分区:基于一个给定连续区间范围,把数据分配到不同的分区。
- list分区:类似range分区,区别在list分区是基于枚举出的值列表分区,range是基于给定的连续区间范围分区。
- hash分区:基于给定的分区个数,把数据分配到不同的分区
- key分区:类似于hash分区
P230)range分区功能特别适用于以下两种情况:
- 当需要删除过期数据时,只需要简单的alter table emp drop partition p0来删除p0分区中的数据,对于具有上百万条记录的表来说,删除分区要比运行一个delete语句有效得多。
- 经常运行包含分区键的查询,MySQL可以很快的确定只有某一个或者某些分区需要扫描,因为其他分区不可能包含有符合该where子句的任何记录。
P231)List分区是建立离散的值列表告诉数据库特定的值属于哪个分区,list分区在很多方面类似range分区,区别在list分区是从属于一个枚举列表的值的集合,range分区是从属于一个连续区间值的集合。
如果试图插入的列值(或者分区表达式的返回值)不包含分区值列表时,那么insert操作将失败并报错。将要匹配的任何值都必须在值列表中找得到。
P232)Columns分区又细分为range columns分区和list columns分区,这两个分区都支持整数、日期时间、字符串三大数据类型。
Columns分区还支持多列分区。range columns分区建的比较是基于元祖(多列时)的比较,也就是基于字段组的比较。
P235)Hash分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。对一个表执行Hash分区时,MySQL会对分区键应用一个散列函数,以此确保数据应当放在N个分区中的哪个分区中。
MySQL支持两种Hash分区,常规Hash分区和线性Hash分区(Linear Hash分区)。常规Hash分区使用的是取模算法,线性Hash分区使用的是一个线性的2的幂的运算法则。
P237)常规Hash分区方式看上去挺不错的,通过取模的方式来使数据尽可能平均分布在每个分区中,让每个分区管理的数据都减少了,提高了查询的效率;可是当我们需要增加分区或者合并分区的时候,问题就出现了。假设原来是5个常规Hash分区,现在需要新增一个常规Hash分区,那么由于取模算法发生了改变,使得原来5个分区中的数据大部分都需要计算重新分区。常规Hash在分区管理上带来的代价太大了,不适合需要灵活变分区的需求。为了降低分区管理上的代价,MySQL提供了线性Hash分区,分区函数是一个线性的2的幂运算法则。
P238)线性Hash分区的优点是,在分区维护(包含增加、删除、合并、拆分分区)时,MySQL能够处理得更加迅速;缺点是,对比常规Hash分区(取模)的时候,线性Hash各个分区之间数据的分布不大均衡。
P239)Key分区非常类似于Hash分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的Hash函数;同时Hash分区只支持整数分区,而Key分区支持使用除BLOB和Text类型外其他类型的列作为分区键。
以上是关于mysql 分区的字段 与 where 的条件有啥样的关系啊的主要内容,如果未能解决你的问题,请参考以下文章
mysql: 两个字段合并,字符时间转时间戳,别名字段作为where条件查询