建立表时默认不是分区表,需要在建表语句中通过特定语法设置才能创建分区表 ,以下是创建不同类型分区表的方式:
分区表是一种将大表的数据按照一定规则划分成多个更小、更容易管理的数据子集(即分区)的技术。
CREATE TABLE orders (
order_id INT,
order_date DATE,
customer_id INT,
amount DECIMAL(10, 2)
)
PARTITION BY RANGE (order_date) (
PARTITION p202401 VALUES LESS THAN ('2024-02-01'),
PARTITION p202402 VALUES LESS THAN ('2024-03-01'),
-- 可继续添加更多分区
);
上述语句中,PARTITION BY RANGE 指明按范围分区,后面括号内是具体的分区定义,每个 PARTITION 子句表示一个分区。
CREATE TABLE employees (
employee_id INT,
employee_name VARCHAR(100),
department VARCHAR(50)
)
PARTITION BY LIST (department) (
PARTITION sales VALUES IN ('销售部'),
PARTITION rnd VALUES IN ('研发部'),
PARTITION finance VALUES IN ('财务部')
);
这里 PARTITION BY LIST 表明是列表分区,每个 PARTITION 子句里的 VALUES IN 指定了该分区对应的取值。
-- 创建一个按用户ID进行哈希分区的用户表
CREATE TABLE users (
user_id INT,
user_name VARCHAR(100),
email VARCHAR(200)
)
-- 使用PARTITION BY HASH指定按哈希分区,分区键为user_id
PARTITION BY HASH (user_id)
-- PARTITIONS子句指定分区数量为4
PARTITIONS 4;
PARTITION BY HASH 说明是哈希分区方式,PARTITIONS 后面跟的数字表示创建的分区数量。
-- 创建普通的B-Tree索引
CREATE INDEX idx_user_name ON users (user_name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_email ON users (email);
-- 创建位图索引
CREATE BITMAP INDEX idx_gender ON users (gender);
-- 假设orders表是分区表,按order_date进行范围分区
-- 创建基于order_date列的本地索引(名字:idx_order_date_local)
CREATE INDEX idx_order_date_local ON orders (order_date);
OceanBase 会为 orders 表的每个分区都创建一个关于 order_date 列的索引
DROP INDEX idx_order_date_local ON orders;
-- 假设orders表是分区表,按order_date进行范围分区
-- 创建基于customer_id列的全局索引
CREATE INDEX idx_customer_id_global ON orders (customer_id) GLOBAL;
如果已经存在普通表,也可以通过 ALTER TABLE 语句将其转换为分区表,但这要求表中数据符合转换后的分区规则。例如,要将已有的 orders 表转换为按 order_date 范围分区的表,可以这样操作:
-- 假设orders表已有数据且包含order_date列
ALTER TABLE orders
-- 重新定义表结构,转换为范围分区表
PARTITION BY RANGE (order_date) (
PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
PARTITION p2024 VALUES LESS THAN ('2025-01-01')
);
(1)删除分区后,分区表上的索引也会删除
(2)删除分区后,建立在分区表上的全局索引会失效,不会删除
-- 1. 删除全局索引,假设全局索引名为 idx_global_prp_claimgather_info(需替换为实际索引名)
DROP INDEX idx_global_prp_claimgather_info ON prp_claimgather_info;
-- 2. 删除分区
ALTER TABLE prp_claimgather_info DROP PARTITION p202412;
-- 3. 重新创建全局索引
CREATE INDEX idx_global_prp_claimgather_info ON prp_claimgather_info (column1, column2,...) -- 替换为实际索引列
GLOBAL;
ALTER INDEX index_name REBUILD GLOBAL;
可通过以下语句确认索引状态(是否失效):
SELECT index_name, status FROM user_indexes WHERE table_name = 'TABLE_NAME';
社区版和企业版(企业版一般会有 Enterprise 字眼)
通过
select version()
命令查询到数据库版本为5.7.25-OceanBase-v4.2.1.6,且版本中不含 “Enterprise”(企业版标识),因此判断为社区版;同时说明该 OceanBase 实例兼容 MySQL 5.7.25 协议;
ps -ef|grep observer
是用于查看 OceanBase 核心进程 “observer” 是否运行的命令
java使用mysql jdbc连接OceanBase数据库 用户名:用户名@租户名#集群名
java使用mysql jdbc连接OceanBase数据库 用户名:用户名@租户名#集群名
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.36.0.85:2883/picc_xwlp?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: xwlp_claim@*****6_zh#ob_test_btx_20240416
password: f7^Kd4%$L
用户名:xwlp_claim