MySQL高级特性-分区表
底层由很多个物理子表组成。mysql实现分区表索引是按照子表定义的,所以没有全局索引。
分区主要目的时将数据按照一个较粗的粒度分在不同的表中。
分区表有限制:
- 一个表最多分1024个分区
- 分区表达式必须是整数,或者是返回整数的表达式
- 如果分区字段中有主键或者唯一索引的列,那么所有主键和唯一主键都必须包含进来
- 分区表无法使用外键约束
对分区表的操作都会“先打开并锁住所有的底层表”,但是并不是分区表在处理过程中锁住全表。
分区表达式可以是列,也可以是包含列的表达式。表达式返回的必须是一个确认的整数,且不能是一个常数。
使用分区表策略:
- 将要扫描的分区限制在很小的范围,然后全量扫描数据,不做索引。
- 索引数据,将热点数据单独存放在一个分区中
分区出现的问题
- 分区的第一个分区是特殊分区,它会见分区表达式值为NULL的放入第一个分区。当使用查询条件时,还可能会去第一个分区查找过滤条件的数据。为了避免第一个分区数据大扫描问题,可以创建一个无用的第一个分区
- 分区列和索引列不匹配:如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤,扫描索引时,就需要扫描所有的分区表中的索引
- 选择分区的成本很高:对于范围分区,没插入一条数据,都需要扫描分区定义列表,确定将数据放在哪个分区表。一般来说,100个左右的分区没有什么问题
- 打开并锁住所有底层表的成本可能很高。这个操作在分区过滤之前发生,所以无法通过分区过滤降低此开销
- 维护分区的成本可能很高
分区使用中的限制:
- 所有分区必须使用相同的存储引擎
- 分区函数中可以使用的函数和表达式也有限制
- 某些存储引擎不支持分区
- 对于MyISAM分区,不能使用LOAD INDEX INTO CACHE操作
- 对于MyISAM表,使用分区表需要打开更多的文件描述符
查询优化:
- 在访问分区表时,最重要的时在WHERE条件中带入分区列