首页 > 编程知识 正文

oracle数据库优点和缺点,diskgenius重建分区表

时间:2023-05-05 06:00:01 阅读:167149 作者:1409

最近我按时间对项目的一些表进行了分区,顺便整理一下mysql分区表的内容,供大家参考。

一.分区表的概念

分区是指用某种方法将一个表中的数据按时间上的月划分为多个较小的、更容易管理的部分,但逻辑上还是一个表。

分区有助于管理非常大的表,并采用了划分逻辑。 分区引入了分区密钥的概念,用于根据一个区间的值(或范围的值)、特定值的列表或hash函数的值执行数据收集。 这样,数据就会按照规则分布在不同的分区中,成为一个大对象——比昂市的小对象。

MySQL分区可以对数据和索引进行分区。

二.分区表类型

MySQL支持以下类型的分区: 范围分区:行数据基于指定的连续范围分区。 很难理解,请看例子吧。 5.5开始支持范围列分区。

LIST分区:与RANGE的区别在于,给定的不是连续范围,而是离散的值。 5.5开始支持列表列分区。

散列分区:根据用户定义表达式的返回值进行分区。 返回值不能为负数。

密钥分区:根据MySQL内部提供的散列函数创建分区。

COLUMNS分区:从5.5开始支持,允许您按原样使用未格式化的数据创建分区。 由于分区是按类型直接比较的,所以不需要将其转换为格式。

无论要创建的分区类型如何,如果主键或唯一索引列存在于表中,则分区列必须是主键或唯一索引的一部分。 索引列可以为空值。 在没有主键和唯一索引的表中,可以将任何列指定为索引列。 表中最多只能有一个唯一索引。 这意味着主密钥和唯一密钥不能同时存在。 但是,除非主密钥包含在unique密钥中。

三.分区应用场景

为了提高大型表和具有不同访问模式的表的可伸缩性、可管理性和数据库效率,MYSQL数据库分区适用于以下方案:

1、表太大不能全部放入内存,或者表的最后一部分只有热点数据,其他都是历史数据。

2、分区表数据易于维护。 例如,如果要批量删除大量数据,可以使用清除整个分区的方法。 还可以执行独立的分区优化、检查、修复等操作。

3、分区表数据分布在不同的物理设备上,高效利用多台硬件设备。

4、使用分区表避免某些瓶颈,如独占访问InnoDB单个索引、ext3文件系统的inode锁定冲突等。

5、独立分区的备份和恢复。 这在非常大的数据集场景中更有效率。

四.分区表的优点和限制

1、优势

1 )可以存储比单个磁盘或文件系统分区更多的数据。

2 )对于已失去存储意义的数据,通常可以通过删除与这些数据相关的分区,容易地删除这些数据。 相反,在某些情况下,添加新数据的过程可以通过向这些新数据添加特殊的新分区来轻松完成。 通常与分区相关的其他优点包括: MySQL分区的这些功能尚未实现,但在优先级列表中具有较高的优先级。 我们想在5.1的生产版本中包含这些功能。

3 )一些查询将得到极大的优化。 这主要是因为满足特定WHERE语句的数据只能存储在一个或多个分区中,所以在搜索时不需要查找剩下的分区。 由于可以在创建分区表后更改分区,因此在首次配置分区方案时可以重新组织数据,以提高频繁查询的效率。

4 )例如SUM )和COUNT )等关于聚合函数的查询可以容易地进行并行处理。 此类查询的简单示例是“SELECT salesperson_id,count(orders ) as order _ totalfromsalesgroupbysalesperson _ id; 中选择所需的族。 “并行”意味着查询可以在每个分区中同时执行,最终结果是通过将所有分区加起来获得的。

5 )通过跨磁盘分布数据查询来提高查询吞吐量。

2、限制

1 )由于需要基于分区列来标识数据所在的分区,分区列必须作为查询条件,如果不使用分区列的查询条件,则无法进行分区过滤,Mysql最终将成为所有交易方

2 )所有分区必须使用同一存储引擎。

3 )某些存储引擎不支持分区(MERGE、CSV、FEDERATED )

4 )一个表最多只能有1024个分区

5 )无法在分区表中为非分区列创建唯一索引(Unique Index )

6 )不能在分区表中使用外键

7 )打开并锁定所有基础表可能会很昂贵

当查询访问分区表时,MySQL必须打开并锁定所有基础表。 这是分区表的另一个开销。 由于此操作在分区过滤之前进行,因此分区过滤无法降低此开销。 它还会影响所有查询,而不管分区类型如何。 对于本身操作非常快的查询(如根据主键查找单行),这将带来明显的开销。 可以在一次操作中减少这样的开销,例如使用批量插入、load data infile或一次删除多行数据。 当然需要限制分区的数量。

8 )分区维护成本可能很高

某些分区维护操作的速度

度会非常快,例如新增或者删除分区。而有些操作,例如充足分区或类似alter语句的操作;这类操作需要赋值数据。重组分区的原理与alter类似,先创建一个临时的分区,然后将数据赋值到其中,然后在删除原分区。

9)分区的字段,必须是表上所有的唯一索引(或者主键索引)包含的字段的子集

一个表上有一个或者多个唯一索引的情况下,分区的字段必须被包含在所有的主键或者唯一索引字段中。

10)分区键非NULL约束

如果分区键所在列没有notnull约束,如果是range分区表,那么null行将被保存在范围最小的分区。如果是list分区表,那么null行将被保存到list为0的分区。

在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。为了避免这种情况的产生,建议分区键设置成NOT NULL。

11)分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。

12)只有RANG和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。

五、mysql分区表的原理

分区表由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区。存储引擎管理分区的各个底层表和管理普通表一样,所有的底层表都必须使用相同的存储引擎,分区表的索引只是在各个底层表上各自加上一个完全相同的索引。

分区表上的操作按照下面的操作逻辑进行:

1、select

当查询一个分区表的时候,分区层先打开并锁定住所有的底层表,优化器先判断是否可以过滤部分分区,然后在调用对应的存储引擎接口访问各个分区的数据。

2、insert

当写入一条记录时,分区层先打开并锁住所有的底层表,然后确定那个分区接收这条记录,在将记录写入对应底层表。

3、delete

当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作。

4、update

当更新一条记录时,分区层先打开并锁住所有的底层表,MySQL先确定需要更新的记录在哪个分区,然后取出数据并更新,在判断更新后的数据应该放在哪个分区,最后对底层表进行写入操作,并对原数据所在的底层表进行删除操作。

有些操作是支持过滤的。例如,当删除一条记录时,MySQL需要先找到这条记录,如果where条件恰好和分区表达式匹配,就可以将所有不包含这条记录的分区都过滤掉。这对update语句同样有效。如果是insert操作,则本身就是只命中一个分区,其他分区都会被过滤掉。MySQL先确定这条记录属于哪个分区,在将记录写入对应的底层分区表,无需对任何其他分区进行操作。虽然每个操作都会先打开并锁住所有的底层表,但这并不是说分区表在处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁,如InnoDB,则会在分区层释放对应的表锁。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。