1. 分区表

  • 分区表是一个独立的表,由多个子表组成
  • 分区表是对底层表的封装,索引也只是每个分区的索引而不是全局索引

作用

  • 表特别大的时候,其中只有一部分是热点数据,其他的都是历史数据
  • 分区表的数据更容易维护,可以单独对一个分区执行一些操作,如删除、优化、检查、修复、备份等。
  • 分区表分布在不同物理设备上,从而高效的利用多个硬件设备

<mark>限制</mark>

  • 一个表最多有1024个分区
  • 分区表达式必须是整数,有时可以直接使用列来分区
  • 主键列和唯一索引列必须包含进来
  • 无法使用外键约束

1.1 原理

  • SELECT:查询一个分区表时,分区层先打开并锁住所有的底层表,优化器先判断是否可以过滤部分分区,再执行查询
  • INSERT:插入一条数据时,分区层先打开并锁住所有的底层表,然后判断时那个分区的,再执行插入
  • DELETE:删除一条数据时,分区层先打开并锁住所有的底层表,然后判断时那个分区的,再执行删除
  • UPDATE:删除一条数据时,分区层先打开并锁住所有的底层表,先查询,再取出数据并更新,再插入,再删除(即执行一遍上面三个操作)

<mark>总结:先所锁住全部数据,再过滤掉不需要的分区,再执行</mark>

1.2 分区表类型

  • 最多的是按照范围分区,每个分区存储某个范围,如按照时间分区
  • 按照数学公式分区,如轮流将数据分到不同分区

1.3 分区的作用

  • 全量扫描数据,不要任何索引。使用where条件可以确定分区,当存储的数据量很大时,可以减少索引的开销或者对磁盘的开销
  • 索引热点数据,将热点数据放在一个分区。可以将热点的数据单独放一个分区,并加上索引,这样即使存储的数据量很大,也能有很好的性能。

1.4 分区的问题

  • NULL会让分区失效。NULL被认为是非法值,所有的NULL都会放在特殊的分区里。
  • 索引的列和分区的列不匹配。这样会导致需要遍历全部分区
  • 维护分区的成本可能很高。重组分区或者ALTER语句需要在新的分区复制数据,然后在将原来的分区删除。

1.5 水平切分

水平切分又称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中。
当一个表的数据不断增多时,Sharding 是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。

1.6 垂直切分

垂直切分是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。
在数据库的层面使用垂直切分将按数据库中表的密集程度部署到不同的库中,例如将原来的电商数据库垂直切分成商品数据库、用户数据库等。

2. 查询缓存

  • 查询缓存保留查询返回的完整结果
  • 系统会追踪涉及的每个表,如果表发生变化,相关的查询缓存就会失效
  • 存储在内存中

InnoDB下的查询缓存

  • 如果当前事务版本号小于数据的创建版本号,则无法缓存
  • 表上有任何的锁,都不能缓存