分区是将一个表的数据按照某种方式,逻辑上仍是一个表,也就是所谓的分区表。分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象变成一些小对象,从而实现对数据的分化管理。作为MySQL数据库中的一个重要机制,MySQL分区表优点和限制也是一目了然的,然而又能够同时实现共存。
一、我们先来看MySQL分区表优点:
1、与单个磁盘或文件系统分区相比,可以存储更多的数据。
2、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
3、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
二、 说完了MySQL分区表优点,我们再来说说MySQL分区表限制。
1、因为需要根据分区列来确定数据所在分区,所以分区列必须作为查询条件, 如果不使用分区列的查询条件,那么就无法进行分区过滤,Mysql最终会扫描所有分区。
2、所有分区都必须使用相同的存储引擎。
3、某些存储引擎不支持分区(MERGE、CSV、FEDERATED)。
4、一张表最多只能有1024个分区。
5、分区表中无法对非分区列建立唯一索引(Unique Index)。
6、分区表中无法使用外键。
7 、打开并锁住所有底层表的成本可能很高。
当查询访问分区表的时候,MySQL需要打开并锁住所有的底层表,这是分区表的另一个开销。这个操作在分区过滤之前发生,所以无法通过分区过滤降低此开销,并且该开销也和分区类型无关,会影响所有的查询。
8、维护分区的成本可能很高
某些分区维护操作的速度会非常快,例如新增或者删除分区。而有些操作,例如充足分区或类似alter语句的操作;这类操作需要赋值数据。重组分区的原理与alter类似,先创建一个临时的分区,然后将数据赋值到其中,然后在删除原分区。
9、分区的字段,必须是表上所有的唯一索引(或者主键索引)包含的字段的子集。一个表上有一个或者多个唯一索引的情况下,分区的字段必须被包含在所有的主键或者唯一索引字段中。
10、分区键非NULL约束
如果分区键所在列没有notnull约束,如果是range分区表,那么null行将被保存在范围最小的分区。如果是list分区表,那么null行将被保存到list为0的分区。
在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。为了避免这种情况的产生,建议分区键设置成NOT NULL。
11、分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。
12、只有RANG和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。
以上就是为大家罗列出的MySQL分区表的优点和限制,我们不难看出尽管MySQL分区表有着十分出众的优点,但其本身存在的限制也是很多的,这就需要我们通过不断的改善和发展技术来实现MySQL分区表的发展。在本站的MySQL教程中还有很多MySQL分区表背后的故事和发展的历史,感兴趣的小伙伴可以去看看,一般情况下,了解一下我们所学知识的背景和历史还是有必要的。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习