MySQL-分区表
底层表的封装意味着索引也是根据分区的子表定义的,没有全局索引。(所以即使有唯一索引,不同子表中也可能有重复数据。)
当单个表数据太大时,索引无效。
把单个表分成几个区域,通过分区函数,可以快速定位数据区域。而且与索引相比,分区不需要额外的数据结构来记录每个分区的数据,成本更低。只需要一个简单的表达式来指向正确的分区。
?你可以用简单的分区方式存储表,不需要任何索引。只要将查询定位到所需的大致数据位置,并通过where条件将所需数据限制在几个分区内,效率就非常高。警告:查询需要扫描的分区数量被限制在一个非常小的数目。
?如果数据有明显的“热点”,可以将热点数据放在单独的分区中,这样这个分区中的数据就可以缓存在内存中。
?如果分区表达式的值可以为空:则第一个分区将创建一个特殊的分区。以按范围年(order_date)分区为例,order _ date列中所有值为空或非法的数据都将放入第一个分区中。那么所有查询将在定位分区后扫描第一个分区。而如果第一个分区非常大,那么查询成本就会被这个“拖瓶”分区无情地增加。
?创建一个无用的第一分区可以解决这个问题,分区p _ nulls值小于(0);
?对于分区列和索引列不匹配的查询,该查询虽然可以使用索引,但无法通过分区定位目标数据的分区(即数据分布相对分散),需要遍历每个分区中的索引,除非查询中的条件也包含分区条件。因此,分区条件的范围有望包含在流行的查询索引中。
?对于范围分区技术,需要适当限制分区数量,否则对于批量导入大量数据的场景,选择分区的成本太高。对于大多数系统,大约100个分区不成问题。