OBCP第四章 SQL调优-分区

简介: OBCP第四章 SQL调优-分区

分区表概述

OceanBase数据库把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起。这种划分区块的表叫做分区表,其中的每一个区块称作分区。分区技术是非常重要的分布式能力之一,它能解决大表的容量问题和并发访问时性能问题。普通的表只有一个分区,可以看作分区表的特例。每个分区只能存在于一个节点内部,分区表的不同分区可以分散在不同节点上。


创建分区的目的是为了在特定的SQL操作中减少数据读写的总量以减少响应时间:


可扩展性,可管理性,提高性能

OceanBase分区表特点

可多机扩展

提高可管理性

提高性能

自动负载均衡、自动容灾

对业务透明,可以取代“分库分表”方案

支持分区间并行

单表分区个数最大8192

单机partition支持上限: 8万(推荐不超过3万)


OceanBase分区表

分为一级分区和二级分区

OB现在支持的一级分区类型有:HASH,KEY,LIST,RANGE,RANGE COLUMNS,生成列分区

二级分区相当于在一级分区的基础上,又从第二个维度进行了拆分


MySQL模式:

RANGE分区,NGE COLUMNS 分区,LIST 分区,LIST COLUMNS 分区,HASH 分区,KEY 分区,组合分区

Oracle 模式:

RANGE 分区,LIST 分区,HASH 分区,组合分区


HASH 分区

一级分区


HASH分区需要指定分区键和分区个数,适合于对不能用 Range 分区、List 分区方法的场景。通过对分区键上的Hash函数值来散列记录到不同分区中。通常用于给定分区键的点查询,例如按照用户id来分区。HASH分区通常能消除热点查询。

create table t1 (c1 int, c2 int) partition by hash(c1 + 1) partitions 5

其中partition by hash(c1+1)指定了分区键c1和分区表达式c1 + 1;partitions 5指定了分区数


OB MySQL模式的Hash分区限制和要求:


分区表达式的结果必须是int类型。

不能写向量,例如partition by hash(c1, c2)

KEY 分区

一级分区

KEY分区与HASH分区类似,也是通过对分区个数取模的方式来确定数据属于哪个分区,不同在于:

系统会对Key分区键做一个内部默认的Hash函数后再取模

用户通常没有办法自己通过简单的计算来得知某一行属于哪个分区

测试发现KEY分区所用到的HASH函数不太均匀

create table t1 (c1 varchar(16), c2 int) partition by key(c1) partitions 5

KEY分区不要求是int类型,可以是任意类型

KEY分区不能写表达式(与HASH分区区别)

KEY分区支持向量

KEY分区有一个特殊的语法

create table t1 (c1 int primary key, c2 int) partition by key() partitions 5

KEY分区分区键不写任何column,表示key分区的列是主键

LIST 分区

一级分区

LIST分区是根据枚举类型的值来划分分区的,主要用于枚举类型

LIST分区的限制和要求

分区表达式的结果必须是int类型

不能写向量,例如partition by list(c1, c2)

create table t1 (c1 int, c2 int) partition by list(c1) 
(partition p0 values in (1,2,3), 
partition p1 values in (5, 6),
partition p2 values in (default));

List columns 和 list 的区别是:

list columns分区不要求是int类型,可以是任意类型

list columns分区不能写表达式

list columns分区支持向量

RANGE 分区

一级分区

RANGE分区是按用户指定的表达式范围将每一条记录划分到不同分区

常用场景: 按时间字段进行分区

目前提供对range分区的分区操作功能,能add/drop分区

存在maxvalue的分区的情况,由于add分区现在只能加在最后,所以会添加分区失败

不存在maxvalue的分区的情况,当插入的数据超出当前分区的最大值,则会插入失败。

CREATE TABLE `info_t`(id INT, gmt_create TIMESTAMP, info VARCHAR(20), PRIMARY KEY (gmt_create)) 
PARTITION BY RANGE(UNIX_TIMESTAMP(gmt_create)) 
(PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2015-01-01 00:00:00')), 
PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2016-01-01 00:00:00')), 
PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2017-01-01 00:00:00')));

RANGE COLUMNS 分区

一级分区

RANGE COLUMNS分区与RANGE分区类似,但不同点在于RANGE COLUMNS分区可以按一个或多个分区键向量进行分区,并且每个分区键的类型除了INT类型还可以支持其他类型,比如VARCHAR、DATETIME等


RANGE COLUMNS和RANGE的区别是


1. RANGE COLUMNS分区不要求是int类型,可以是任意类型

2. RANGE COLUMNS分区不能写表达式

3. RANGE COLUMNS分区支持向量

生成列分区  

一级分区

生成列是指这一列是由其他列计算而得

生成列分区是指将生成列作为分区键进行分区,该功能能够更好的满足期望将某些字段进行一定处理后作为分区键的需求(比如提取一个字段的一部分,作为分区键)

CREATE TABLE gc_part_t(t_key varchar(10) PRIMARY KEY, gc_user_id VARCHAR(4) GENERATED 
ALWAYS AS (SUBSTRING(t_key, 1, 4)) VIRTUAL, c3 INT) 
PARTITION BY KEY(gc_user_id) 
PARTITIONS 10;

二级分区

二级分区是指按照两个维度来把数据拆分成分区。最常用的地方就是类似用户账单领域,会按照user_id做HASH分区,按照账单创建时间做RANGE分区

示例:按两个维度划分数据:

CREATE TABLE history_t (user_id INT, 
gmt_create DATETIME, info VARCHAR(20), 
PRIMARY KEY(user_id, gmt_create)) 
PARTITION BY RANGE COLUMNS (gmt_create) 
SUBPARTITION BY HASH(user_id) SUBPARTITIONS 3 
(PARTITION p0 VALUES LESS THAN ('2014-11-11'), 
PARTITION p1 VALUES LESS THAN ('2015-11-11'), 
PARTITION p2 VALUES LESS THAN ('2016-11-11'),
PARTITION p3 VALUES LESS THAN ('2017-11-11')
);



二级分区支持的分区方式

二级分区支持的分区方式


HASH/KEY + RANGE/RANGE_COLUMNS 分区

RANGE/RANGE_COLUMNS + HASH/KEY 分区

LIST/LIST_COLUMNS+ RANGE/RANGE_COLUMNS 分区

RANGE/RANGE_COLUMNS + LIST/LIST_COLUMNS分区

HASH/KEY + LIST/LIST_COLUMNS 分区

LIST/LIST_COLUMNS+HASH/KEY 分区

对于RANGE分区的分区操作add/drop,必须是RANGE分区作为一级分区的方式。所以强烈建议用RANGE + HASH的分区方式,而不是HASH + RANGE。


分区管理

增加分区

伴随数据量增长,range分区需要能够扩展 -> ADD PARTITION


语法: ALTER TABLE ... ADD PARTITION

ALTER TABLE members ADD PARTITION(PARTITION p3 VALUES LESS THAN(2000));

删除分区

对于按时间范围分区的表,有时需要作过期数据清理 -> DROP PARTITION

语法: ALTER TABLE ... DROP PARTITION

ALTER TABLE members DROP PARTITION(P3);

使用限制

只有range分区,可以删除任意一个一级range分区

只能以append方式往后添加分区,也就是说,新加分区的range value总是最大的


分区选择和分区裁剪

表结构

create table t2(c1 int primary key, c2 int, c3 int) partition by hash(c1) partitions 5;

分区选择

explain select * from t1 partition(p4);


分区裁剪

explain select * from t2 where c1 = 5 or c1 = 4;


一级分区裁剪的基本原理-Hash/List 分区

分区裁剪就是根据 where 子句里面的条件并且计算得到分区列的值,然后通过结果判断需要访问哪些分区如果分区函数为表达式,且该表达式作为一个整体出现在等值条件里,也可以做分区裁剪

一级分区裁剪的基本原理-Range分区

通过where子句的分区键的范围跟表定义的分区范围的交集来确定需要访问的分区

对于Range分区,因为考虑到函数单调性,如果分区表达式是一个函数并且查询条件是一个范围,则不支持分区裁剪



二级分区裁剪的基本原理

对于二级分区,先按照一级分区键确定一级需要访问的分区,然后在通过二级分区键确定二级分区需要访问的分区。然后做一个乘积确定二级分区访问的所有物理分区。


分区表的使用建议


业务形态(热点数据打散、历史数据维护便利性、业务SQL的条件形态(分区裁剪)


OB各种分区类型的设置要求


分区键必须是主键的子集


Range分区,最后一个不能是maxvalue


考虑分区裁剪、partition wise join优化


Leader binding\Tablegroup


为了避免写入放大问题,选择表的自定义主键时,不要使用随机生成的值,要尽量有序,比如时序递增的。


分区个数:单机分区上限、单机租户允许创建的最大分区数量上限、单表分区数上限


相关文章
|
5月前
|
SQL 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
569 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
59 1
|
3月前
|
SQL 分布式计算 数据库
SQL调优总结
数据库表的规范化和反规范化设计,设计合适的字段数据类型……
47 8
|
4月前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
222 0
|
4月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`<s:checkbox>`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
91 0
|
4月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
57 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL性能调优的神奇之处:如何用优化技巧让你的数据库查询飞起来,实现秒级响应?
【8月更文挑战第31天】在现代软件开发中,数据库性能至关重要。本文通过一个实战案例,展示了从慢查询到秒级响应的全过程。通过对查询的详细分析与优化,包括创建索引、改进查询语句及数据类型选择等措施,最终显著提升了性能。文章还提供了示例代码及最佳实践建议,帮助读者掌握SQL性能调优的核心技巧。
229 0
|
5月前
|
机器学习/深度学习 SQL 自然语言处理
现代深度学习框架构建问题之深度学习通用架构的定义如何解决
现代深度学习框架构建问题之深度学习通用架构的定义如何解决
50 3
|
5月前
|
SQL 分布式计算 DataWorks
MaxCompute操作报错合集之使用sql查询一个表的分区数据时遇到报错,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。