分区表对于用户而言,分区表是一个独立的逻辑表,但是底层是由多个物理子表组成。分区表对于用户而言是一个完全封装底层实现的黑盒子,对用户而言是透明的,从文件系统中可以看到多个使用#分隔命名的表文件。mysql在 ...
分区表 对于用户而言,分区表是一个独立的逻辑表,但是底层是由多个物理子表组成。分区表对于用户而言是一个完全封装底层实现的黑盒子,对用户而言是透明的,从文件系统中可以看到多个使用#分隔命名的表文件。 mysql在创建表时使用partition by子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询就无须扫描所有分区。 分区的主要目的是将数据安好一个较粗的力度分在不同的表中,这样可以将相关的数据存放在一起。 分区表的应用场景 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据 分区表的数据更容易维护 批量删除大量数据可以使用清除整个分区的方式 对一个独立分区进行优化、检查、修复等操作 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备 可以使用分区表来避免某些特殊的瓶颈 innodb的单个索引的互斥访问 ext3文件系统的inode锁竞争 可以备份和恢复独立的分区 分区表的限制 一个表最多只能有1024个分区,在5.7版本的时候可以支持8196个分区 在早期的mysql中,分区表达式必须是整数或者是返回整数的表达式,在mysql5.5中,某些场景可以直接使用列来进行分区 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来 分区表无法使用外键约束 分区表的原理 分区表的底层原理.md 分区表的类型 范围分区 根据列值在给定范围内将行分配给分区 列表分区 类似于按range分区,区别在于list分区是基于列值匹配一个离散值集合中的某个值来进行选择 列分区 mysql从5.5开始支持column分区,可以认为i是range和list的升级版,在5.5之后,可以使用column分区替代range和list,但是column分区只接受普通列不接受表达式 hash分区 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含myql中有效的、产生非负整数值的任何表达式 key分区 类似于hash分区,区别在于key分区只支持一列或多列,且mysql服务器提供其自身的哈希函数,必须有一列或多列包含整数值 子分区 在分区的基础之上,再进行分区后存储 如何使用分区表 全量扫描数据,不要任何索引 索引数据,并分离热点 在使用分区表的时候需要注意的问题 null值会使分区过滤无效 分区列和索引列不匹配,会导致查询无法进行分区过滤 选择分区的成本可能很高 打开并锁住所有底层表的成本可能很高 维护分区的成本可能很高 |