OceanBase 是由PGZ Club自主研發的分佈式關係型數據庫,兼容 MySQL 和 Oracle 兩種模式。在 MySQL 模式下,OceanBase 的語法與 MySQL 高度兼容(主要兼容 MySQL 5.6/5.7,部分兼容 8.0),但也存在一些差異和限制。
以下是 OceanBase(MySQL 模式)中常用語法及注意事項的概述:
一、基本 DDL 語法
1. 創建數據庫
CREATE DATABASE db_name;
2. 使用數據庫
USE db_name;
3. 創建表(支持分區)
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(100),
gmt_create DATETIME DEFAULT CURRENT_TIMESTAMP
)
PARTITION BY HASH(id) PARTITIONS 4;
注意:OceanBase 推薦使用分區表以發揮分佈式優勢。非分區表默認為“單分區表”。
4. 添加索引
-- 普通索引
CREATE INDEX idx_name ON t1(name);
-- 唯一索引
CREATE UNIQUE INDEX uk_id ON t1(id);
注意:OceanBase 不支持全文索引(FULLTEXT)、空間索引(SPATIAL)等高級索引類型。
二、DML 語法(與 MySQL 類似)
INSERT INTO t1 (id, name) VALUES (1, 'Alice');
UPDATE t1 SET name = 'Bob' WHERE id = 1;
DELETE FROM t1 WHERE id = 1;
SELECT * FROM t1 WHERE name LIKE 'A%';
支持 LIMIT、ORDER BY、GROUP BY、JOIN 等標準語法。
三、事務控制
OceanBase 支持 ACID 事務,語法如下:
BEGIN;
UPDATE t1 SET name = 'Charlie' WHERE id = 1;
COMMIT;
-- 或回滾
ROLLBACK;
注意:跨分區事務性能較低,建議儘量將相關數據放在同一分區內。
四、系統變量與函數
查看變量
SHOW VARIABLES LIKE 'ob%';
常用函數(兼容 MySQL)
NOW(),CURDATE(),UNIX_TIMESTAMP()IFNULL(),COALESCE()CONCAT(),SUBSTRING()- 聚合函數:
COUNT(),SUM(),AVG(),MAX(),MIN()
注意:部分 MySQL 函數可能不支持,如
JSON_EXTRACT在早期版本中受限(新版本已增強 JSON 支持)。
五、分區語法(重點)
OceanBase 強調分區設計,支持以下分區類型:
- HASH 分區
- RANGE 分區
- LIST 分區
- KEY 分區
- 複合分區(如 RANGE + HASH)
示例(RANGE 分區):
CREATE TABLE orders (
order_id BIGINT NOT NULL,
order_date DATE NOT NULL,
customer_id INT
)
PARTITION BY RANGE COLUMNS(order_date) (
PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
PARTITION p2024 VALUES LESS THAN ('2025-01-01'),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
六、與 MySQL 的主要差異
|
功能
|
OceanBase(MySQL 模式)
|
MySQL
|
|
存儲引擎
|
無 InnoDB/MyISAM 概念,統一為 OceanBase 存儲引擎
|
支持多種存儲引擎
|
|
外鍵
|
不支持外鍵約束 |
支持
|
|
觸發器
|
不支持 |
支持
|
|
存儲過程/函數
|
有限支持(較新版本逐步支持) |
完整支持
|
|
視圖
|
支持只讀視圖
|
支持可更新視圖
|
|
AUTO_INCREMENT
|
支持,但需注意全局唯一性(分佈式場景)
|
本地自增
|
|
默認字符集
|
utf8mb4
|
可配置
|
七、管理命令(部分)
-- 查看當前租户信息
SHOW TENANT STATUS;
-- 查看分區信息
SELECT * FROM oceanbase.__all_virtual_meta_table WHERE table_id = (SELECT table_id FROM __all_virtual_table WHERE table_name = 't1');
-- 查看執行計劃
EXPLAIN SELECT * FROM t1 WHERE id = 1;
系統表前綴通常為
oceanbase.__all_virtual_xxx。