第七章 MySQL高级特性.md

MySQL高级特性-分区表

底层由很多个物理子表组成。mysql实现分区表索引是按照子表定义的,所以没有全局索引。

分区主要目的时将数据按照一个较粗的粒度分在不同的表中。

分区表有限制:

  1. 一个表最多分1024个分区
  2. 分区表达式必须是整数,或者是返回整数的表达式
  3. 如果分区字段中有主键或者唯一索引的列,那么所有主键和唯一主键都必须包含进来
  4. 分区表无法使用外键约束

对分区表的操作都会“先打开并锁住所有的底层表”,但是并不是分区表在处理过程中锁住全表。

分区表达式可以是列,也可以是包含列的表达式。表达式返回的必须是一个确认的整数,且不能是一个常数。

使用分区表策略:

  1. 将要扫描的分区限制在很小的范围,然后全量扫描数据,不做索引。
  2. 索引数据,将热点数据单独存放在一个分区中

分区出现的问题

  1. 分区的第一个分区是特殊分区,它会见分区表达式值为NULL的放入第一个分区。当使用查询条件时,还可能会去第一个分区查找过滤条件的数据。为了避免第一个分区数据大扫描问题,可以创建一个无用的第一个分区
  2. 分区列和索引列不匹配:如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤,扫描索引时,就需要扫描所有的分区表中的索引
  3. 选择分区的成本很高:对于范围分区,没插入一条数据,都需要扫描分区定义列表,确定将数据放在哪个分区表。一般来说,100个左右的分区没有什么问题
  4. 打开并锁住所有底层表的成本可能很高。这个操作在分区过滤之前发生,所以无法通过分区过滤降低此开销
  5. 维护分区的成本可能很高

分区使用中的限制:

  1. 所有分区必须使用相同的存储引擎
  2. 分区函数中可以使用的函数和表达式也有限制
  3. 某些存储引擎不支持分区
  4. 对于MyISAM分区,不能使用LOAD INDEX INTO CACHE操作
  5. 对于MyISAM表,使用分区表需要打开更多的文件描述符

查询优化:

  1. 在访问分区表时,最重要的时在WHERE条件中带入分区列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值