1. 首页 > 国产数据库教程 > OceanBase教程 > 正文

OceanBase教程FG111-OceanBase DBA SQL语言与开发实战

本文档风哥主要介绍OceanBase DBA的SQL语言与开发实战,包括SQL语言的概念与特性、SQL语法与规范、SQL优化基础、SQL开发规范、SQL性能调优策略、SQL安全最佳实践、SQL开发实战、SQL优化实战、SQL监控与审计、实战案例等内容,风哥教程参考OceanBase官方文档SQL参考手册、开发指南等内容编写,适合DBA人员和开发人员在学习和工作中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 OceanBase SQL语言的概念与特性

OceanBase SQL是OceanBase数据库的查询语言,用于管理和操作数据库中的数据。OceanBase SQL的特性包括:

  • 标准兼容:兼容SQL标准,支持大部分ANSI SQL语法
  • 高性能:针对分布式架构进行了优化,支持高并发查询
  • 功能丰富:支持复杂查询、事务、索引、视图等功能
  • 扩展性:支持自定义函数、存储过程等
  • 安全性:支持权限控制、数据加密等安全特性

1.2 OceanBase SQL语法与规范

OceanBase SQL的基本语法包括:

  • 数据定义语言(DDL):用于创建、修改和删除数据库对象,如CREATE、ALTER、DROP等
  • 数据操纵语言(DML):用于查询、插入、更新和删除数据,如SELECT、INSERT、UPDATE、DELETE等
  • 数据控制语言(DCL):用于控制用户权限,如GRANT、REVOKE等
  • 事务控制语言(TCL):用于控制事务,如COMMIT、ROLLBACK等

OceanBase SQL的规范:

  • 命名规范:表名、列名使用小写字母,单词之间用下划线分隔
  • 缩进规范:使用4个空格进行缩进,提高代码可读性
  • 注释规范:使用–进行单行注释,使用/* */进行多行注释
  • SQL语句长度:避免过长的SQL语句,提高可读性

1.3 OceanBase SQL优化基础

OceanBase SQL优化的基础包括:

  • 执行计划:了解SQL语句的执行计划,识别性能瓶颈
  • 索引优化:合理创建和使用索引,提高查询性能
  • SQL语句优化:优化SQL语句结构,减少不必要的操作
  • 统计信息:保持统计信息的准确性,帮助优化器生成正确的执行计划
  • 参数调优:调整数据库参数,提高SQL执行性能

Part02-生产环境规划与建议

2.1 OceanBase SQL开发规范

OceanBase SQL开发的规范:

# SQL开发规范

## 1. 命名规范
– 数据库名:使用小写字母,单词之间用下划线分隔,如fgedudb
– 表名:使用小写字母,单词之间用下划线分隔,前缀使用业务标识,如fgedu_user
– 列名:使用小写字母,单词之间用下划线分隔,如user_id
– 索引名:使用小写字母,单词之间用下划线分隔,前缀使用idx_,如idx_user_id
– 视图名:使用小写字母,单词之间用下划线分隔,前缀使用v_,如v_user
– 存储过程名:使用小写字母,单词之间用下划线分隔,前缀使用sp_,如sp_get_user

## 2. 代码风格
– 缩进:使用4个空格进行缩进
– 换行:每个关键字独占一行,风哥提示:。
– 大小写:SQL关键字使用大写,标识符使用小写
– 注释:添加必要的注释,提高代码可读性

## 3. SQL语句规范
– SELECT语句:明确指定列名,避免使用SELECT *
– INSERT语句:明确指定列名,避免依赖默认顺序
– UPDATE语句:使用WHERE子句,避免全表更新
– DELETE语句:使用WHERE子句,避免全表删除
– JOIN语句:明确指定JOIN条件,避免笛卡尔积

## 4. 性能规范
– 索引使用:合理创建和使用索引
– 子查询:避免嵌套过深的子查询
– 临时表:合理使用临时表,提高查询性能
– 分页查询:使用LIMIT子句进行分页,避免返回过多数据
– 批量操作:使用批量插入、更新和删除,减少网络开销

## 5. 安全规范
– 防止SQL注入:使用参数化查询,避免拼接SQL语句
– 权限控制:遵循最小权限原则,只授予必要的权限
– 敏感数据:对敏感数据进行加密或脱敏处理
– 审计日志:开启审计日志,记录SQL执行情况

## 6. 可维护性规范
– 模块化:将复杂的SQL语句拆分为多个模块
– 文档:为复杂的SQL语句添加文档说明
– 版本控制:对SQL代码进行版本控制
– 测试:对SQL语句进行充分的测试,学习交流加群风哥微信: itpux-com。

2.2 OceanBase SQL性能调优策略

OceanBase SQL性能调优的策略:

# SQL性能调优策略

## 1. 索引优化
– 创建合适的索引:根据查询条件创建索引
– 避免过度索引:过多的索引会影响插入和更新性能
– 定期维护索引:重建或重组索引,提高索引性能
– 使用复合索引:根据查询条件的顺序创建复合索引

## 2. SQL语句优化
– 避免SELECT *:只查询需要的列
– 避免使用函数:函数会导致索引失效
– 避免使用OR:使用IN代替OR
– 避免使用NOT IN:使用NOT EXISTS代替NOT IN
– 避免使用LIKE ‘%…’:前缀匹配可以使用索引

## 3. 执行计划优化
– 查看执行计划:使用EXPLAIN查看执行计划
– 分析执行计划:识别性能瓶颈
– 优化执行计划:调整SQL语句或索引,优化执行计划
– 强制使用索引:在必要时使用FORCE INDEX

## 4. 统计信息优化
– 更新统计信息:定期更新表的统计信息
– 收集统计信息:使用ANALYZE TABLE收集统计信息
– 监控统计信息:监控统计信息的准确性

## 5. 参数调优
– 调整内存参数:如memory_limit、cache_size等
– 调整并发参数:如max_connections、thread_pool_size等
– 调整查询参数:如sort_buffer_size、join_buffer_size等

## 6. 存储优化
– 分区表:对大表使用分区表,提高查询性能
– 数据压缩:使用数据压缩,减少存储空间
– 存储引擎:选择合适的存储引擎,学习交流加群风哥QQ113257174。

## 7. 应用优化
– 连接池:使用连接池,减少连接建立的开销
– 批量操作:使用批量插入、更新和删除
– 缓存:使用缓存,减少数据库访问
– 异步处理:对耗时操作使用异步处理

2.3 OceanBase SQL安全最佳实践

OceanBase SQL安全的最佳实践:

  • 防止SQL注入:
    • 使用参数化查询,避免拼接SQL语句
    • 对输入进行验证和过滤
    • 使用预编译语句
  • 权限控制:
    • 遵循最小权限原则,只授予必要的权限
    • 定期审查用户权限
    • 使用角色管理权限
  • 敏感数据保护:
    • 对敏感数据进行加密
    • 使用数据脱敏技术
    • 限制敏感数据的访问
  • 审计与监控:
    • 开启审计日志,记录SQL执行情况
    • 监控异常SQL操作
    • 定期检查安全漏洞

Part03-生产环境项目实施方案

3.1 OceanBase SQL开发实战

,更多视频教程www.fgedu.net.cn。

3.1.1 OceanBase表结构设计

# 表结构设计实战

## 1. 创建数据库
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE DATABASE fgedudb;”

## 2. 创建用户表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.user (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);”

## 3. 创建订单表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.order (
order_id INT PRIMARY KEY,
user_id INT NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
order_status VARCHAR(20) NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES fgedu.user(user_id)
);”

## 4. 创建订单明细表
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.order_item (
item_id INT PRIMARY KEY,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES fgedu.order(order_id)
);”,更多学习教程公众号风哥教程itpux_com。

## 5. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_username ON fgedu.user(username);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_user_id ON fgedu.order(user_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_item_order_id ON fgedu.order_item(order_id);”

## 6. 插入测试数据
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.user (user_id, username, password, email, phone) VALUES
(1, ‘user1’, ‘password1’, ‘user1@example.com’, ‘13800138001’),
(2, ‘user2’, ‘password2’, ‘user2@example.com’, ‘13800138002’),
(3, ‘user3’, ‘password3’, ‘user3@example.com’, ‘13800138003’);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.order (order_id, user_id, order_amount, order_status) VALUES
(1, 1, 100.00, ‘pending’),
(2, 1, 200.00, ‘completed’),
(3, 2, 150.00, ‘pending’);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.order_item (item_id, order_id, product_id, quantity, price) VALUES
(1, 1, 1, 2, 50.00),
(2, 2, 2, 1, 200.00),
(3, 3, 1, 3, 50.00);”

3.1.2 OceanBase SQL查询开发

# SQL查询开发实战

## 1. 基本查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user;”

+———+———-+———-+——————+————-+———————+———————+,from DB视频:www.itpux.com。
| user_id | username | password | email | phone | create_time | update_time |
+———+———-+———-+——————+————-+———————+———————+
| 1 | user1 | password1 | user1@example.com | 13800138001 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 2 | user2 | password2 | user2@example.com | 13800138002 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 3 | user3 | password3 | user3@example.com | 13800138003 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
+———+———-+———-+——————+————-+———————+———————+

## 2. 条件查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE order_status = ‘pending’;”

+———-+———+————–+————–+———————+———————+
| order_id | user_id | order_amount | order_status | create_time | update_time |
+———-+———+————–+————–+———————+———————+
| 1 | 1 | 100.00 | pending | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 3 | 2 | 150.00 | pending | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
+———-+———+————–+————–+———————+———————+

## 3. 连接查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT o.order_id, u.username, o.order_amount, o.order_status
FROM fgedu.order o
JOIN fgedu.user u ON o.user_id = u.user_id;”

+———-+———-+————–+————–+
| order_id | username | order_amount | order_status |
+———-+———-+————–+————–+
| 1 | user1 | 100.00 | pending |
| 2 | user1 | 200.00 | completed |
| 3 | user2 | 150.00 | pending |
+———-+———-+————–+————–+

## 4. 子查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user
WHERE user_id IN (SELECT user_id FROM fgedu.order WHERE order_status = ‘pending’);”

+———+———-+———-+——————+————-+———————+———————+
| user_id | username | password | email | phone | create_time | update_time |
+———+———-+———-+——————+————-+———————+———————+
| 1 | user1 | password1 | user1@example.com | 13800138001 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 2 | user2 | password2 | user2@example.com | 13800138002 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
+———+———-+———-+——————+————-+———————+———————+

## 5. 聚合查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT user_id, COUNT(*) as order_count, SUM(order_amount) as total_amount
FROM fgedu.order
GROUP BY user_id;”

+———+————+————–+
| user_id | order_count | total_amount |
+———+————+————–+
| 1 | 2 | 300.00 |
| 2 | 1 | 150.00 |
+———+————+————–+

## 6. 排序查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order
ORDER BY order_amount DESC;”

+———-+———+————–+————–+———————+———————+
| order_id | user_id | order_amount | order_status | create_time | update_time |
+———-+———+————–+————–+———————+———————+
| 2 | 1 | 200.00 | completed | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 3 | 2 | 150.00 | pending | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 1 | 1 | 100.00 | pending | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
+———-+———+————–+————–+———————+———————+

## 7. 分页查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user
ORDER BY user_id
LIMIT 2 OFFSET 1;”

+———+———-+———-+——————+————-+———————+———————+
| user_id | username | password | email | phone | create_time | update_time |
+———+———-+———-+——————+————-+———————+———————+
| 2 | user2 | password2 | user2@example.com | 13800138002 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
| 3 | user3 | password3 | user3@example.com | 13800138003 | 2026-04-10 10:00:00 | 2026-04-10 10:00:00 |
+———+———-+———-+——————+————-+———————+———————+

3.2 OceanBase SQL优化实战

3.2.1 OceanBase索引优化

# 索引优化实战

## 1. 分析查询执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1;”

+——————————————+———-+———–+—————+———————————–+
| ID | EST. ROW | COST | TABLE | OPERATION |
+——————————————+———-+———–+—————+———————————–+
| 0 | 1 | 100 | order | TABLE SCAN |
+——————————————+———-+———–+—————+———————————–+

## 2. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_user_id ON fgedu.order(user_id);”

## 3. 再次分析执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1;”

+——————————————+———-+———–+—————+———————————–+
| ID | EST. ROW | COST | TABLE | OPERATION |
+——————————————+———-+———–+—————+———————————–+
| 0 | 1 | 10 | order | INDEX SCAN |
+——————————————+———-+———–+—————+———————————–+

## 4. 优化复合索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_user_id_status ON fgedu.order(user_id, order_status);”

## 5. 分析复合索引效果
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1 AND order_status = ‘pending’;”

+——————————————+———-+———–+—————+———————————–+
| ID | EST. ROW | COST | TABLE | OPERATION |
+——————————————+———-+———–+—————+———————————–+
| 0 | 1 | 5 | order | INDEX SCAN |
+——————————————+———-+———–+—————+———————————–+

## 6. 索引维护
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “ALTER TABLE fgedu.order REBUILD INDEX idx_order_user_id;”

## 7. 索引使用建议
– 为经常用于查询条件的列创建索引
– 为经常用于连接条件的列创建索引
– 为经常用于排序的列创建索引
– 避免在索引列上使用函数
– 避免创建过多的索引

3.2.2 OceanBase SQL语句优化

# SQL语句优化实战

## 1. 优化前的SQL
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE order_status = ‘pending’ OR order_status = ‘completed’;”

## 2. 优化后的SQL(使用IN)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE order_status IN (‘pending’, ‘completed’);”

## 3. 优化前的SQL
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user WHERE username LIKE ‘%user%’;”

## 4. 优化后的SQL(使用前缀匹配)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user WHERE username LIKE ‘user%’;”

## 5. 优化前的SQL
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE user_id NOT IN (SELECT user_id FROM fgedu.user WHERE username = ‘user1’);”

## 6. 优化后的SQL(使用NOT EXISTS)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order o WHERE NOT EXISTS (SELECT 1 FROM fgedu.user u WHERE u.user_id = o.user_id AND u.username = ‘user1’);”

## 7. 优化前的SQL
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order;”

## 8. 优化后的SQL(明确指定列名)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount, order_status FROM fgedu.order;”

## 9. 优化前的SQL
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order o JOIN fgedu.order_item oi ON o.order_id = oi.order_id;”

## 10. 优化后的SQL(使用内连接)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT o.order_id, o.user_id, o.order_amount, oi.product_id, oi.quantity, oi.price
FROM fgedu.order o
INNER JOIN fgedu.order_item oi ON o.order_id = oi.order_id;”

3.3 OceanBase SQL监控与审计

3.3.1 OceanBase SQL监控

# SQL监控实施

## 1. 开启SQL监控
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET enable_sql_monitor = ‘True’;”

## 2. 查看慢SQL
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_slow_stat WHERE tenant_id = 1001 ORDER BY start_time DESC LIMIT 10;”

## 3. 查看SQL执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1;”

## 4. 查看SQL统计信息
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_sql_stat WHERE tenant_id = 1001 ORDER BY executions DESC LIMIT 10;”

## 5. 查看会话信息
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_session WHERE tenant_id = 1001;”

## 6. 监控SQL执行情况
– 使用OCP监控SQL执行情况
– 设置慢SQL告警
– 定期分析慢SQL

## 7. 优化SQL执行
– 分析慢SQL的执行计划
– 优化SQL语句或索引
– 调整数据库参数

3.3.2 OceanBase SQL审计

# SQL审计实施

## 1. 开启审计日志
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET audit_enabled = ‘True’;”

## 2. 设置审计范围
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET audit_record_level = ‘ALL’;”

## 3. 查看审计日志
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_audit_record WHERE tenant_id = 1001 ORDER BY event_time DESC LIMIT 10;”

## 4. 审计SQL操作
– 监控用户登录和注销
– 监控权限变更
– 监控数据操作
– 监控DDL操作

## 5. 生成审计报告
– 统计SQL执行情况
– 分析异常SQL操作
– 提出优化建议

## 6. 审计结果处理
– 对异常SQL操作进行调查
– 对违反安全规定的操作进行处理
– 对性能问题进行优化

Part04-生产案例与实战讲解

4.1 OceanBase SQL开发实战案例

# SQL开发实战案例

## 案例背景
– 生产环境:3节点OceanBase集群
– 需求:开发一个用户管理系统的SQL脚本

## 实施步骤

### 1. 创建数据库和表结构
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE DATABASE fgedudb;”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.user (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.role (
role_id INT PRIMARY KEY,
role_name VARCHAR(50) NOT NULL,
description VARCHAR(200),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.user_role (
user_id INT NOT NULL,
role_id INT NOT NULL,
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES fgedu.user(user_id),
FOREIGN KEY (role_id) REFERENCES fgedu.role(role_id)
);”

### 2. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_username ON fgedu.user(username);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_email ON fgedu.user(email);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_role_user_id ON fgedu.user_role(user_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_role_role_id ON fgedu.user_role(role_id);”

### 3. 插入测试数据
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.role (role_id, role_name, description) VALUES
(1, ‘admin’, ‘系统管理员’),
(2, ‘user’, ‘普通用户’),
(3, ‘guest’, ‘访客’);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.user (user_id, username, password, email, phone) VALUES
(1, ‘admin’, ‘admin123’, ‘admin@example.com’, ‘13800138001’),
(2, ‘user1’, ‘user123’, ‘user1@example.com’, ‘13800138002’),
(3, ‘user2’, ‘user123’, ‘user2@example.com’, ‘13800138003’);”

$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.user_role (user_id, role_id) VALUES
(1, 1),
(1, 2),
(2, 2),
(3, 3);”

### 4. 开发SQL查询
– 查询所有用户
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.user;”

– 查询用户及其角色
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT u.user_id, u.username, r.role_name
FROM fgedu.user u
JOIN fgedu.user_role ur ON u.user_id = ur.user_id
JOIN fgedu.role r ON ur.role_id = r.role_id;”

– 查询具有admin角色的用户
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT u.user_id, u.username
FROM fgedu.user u
JOIN fgedu.user_role ur ON u.user_id = ur.user_id
JOIN fgedu.role r ON ur.role_id = r.role_id
WHERE r.role_name = ‘admin’;”

### 5. 开发SQL修改操作
– 更新用户信息
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “UPDATE fgedu.user SET phone = ‘13800138004’ WHERE user_id = 1;”

– 添加用户角色
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu.user_role (user_id, role_id) VALUES (2, 3);”

– 删除用户角色
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “DELETE FROM fgedu.user_role WHERE user_id = 3 AND role_id = 3;”

## 案例总结
– 成功创建了数据库和表结构
– 开发了用户管理系统的SQL脚本
– 验证了SQL语句的正确性
– 掌握了SQL开发的基本操作

4.2 OceanBase SQL优化实战案例

# SQL优化实战案例

## 案例背景
– 生产环境:3节点OceanBase集群
– 问题:查询订单数据时性能较慢

## 实施步骤

### 1. 分析慢SQL
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_slow_stat WHERE tenant_id = 1001 ORDER BY start_time DESC LIMIT 10;”

### 2. 查看执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1 AND order_status = ‘pending’;”

+——————————————+———-+———–+—————+———————————–+
| ID | EST. ROW | COST | TABLE | OPERATION |
+——————————————+———-+———–+—————+———————————–+
| 0 | 1 | 100 | order | TABLE SCAN |
+——————————————+———-+———–+—————+———————————–+

### 3. 创建索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_user_id_status ON fgedu.order(user_id, order_status);”

### 4. 再次分析执行计划
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu.order WHERE user_id = 1 AND order_status = ‘pending’;”

+——————————————+———-+———–+—————+———————————–+
| ID | EST. ROW | COST | TABLE | OPERATION |
+——————————————+———-+———–+—————+———————————–+
| 0 | 1 | 5 | order | INDEX SCAN |
+——————————————+———-+———–+—————+———————————–+

### 5. 测试查询性能
– 优化前
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE user_id = 1 AND order_status = ‘pending’;”

– 优化后
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE user_id = 1 AND order_status = ‘pending’;”

### 6. 优化其他查询
– 优化连接查询
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT o.order_id, u.username, o.order_amount
FROM fgedu.order o
JOIN fgedu.user u ON o.user_id = u.user_id
WHERE o.order_status = ‘completed’;”

– 创建必要的索引
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_status ON fgedu.order(order_status);”

– 再次测试查询性能
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT o.order_id, u.username, o.order_amount
FROM fgedu.order o
JOIN fgedu.user u ON o.user_id = u.user_id
WHERE o.order_status = ‘completed’;”

## 案例总结
– 成功优化了慢SQL
– 创建了合适的索引
– 提高了查询性能
– 掌握了SQL优化的基本方法

4.3 OceanBase SQL性能调优实战案例

# SQL性能调优实战案例

## 案例背景
– 生产环境:3节点OceanBase集群
– 问题:系统响应时间较长,需要进行性能调优

## 实施步骤

### 1. 监控系统状态
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_server_stat;”

### 2. 分析慢SQL
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “SELECT * FROM oceanbase.__all_virtual_slow_stat WHERE tenant_id = 1001 ORDER BY start_time DESC LIMIT 10;”

### 3. 优化SQL语句
– 优化前
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT * FROM fgedu.order WHERE order_date BETWEEN ‘2026-01-01’ AND ‘2026-04-10’;”

– 优化后(添加索引)
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_order_date ON fgedu.order(order_date);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount, order_status FROM fgedu.order WHERE order_date BETWEEN ‘2026-01-01’ AND ‘2026-04-10′;”

### 4. 调整数据库参数
– 调整内存参数
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET memory_limit = ’24G’;”

– 调整并发参数
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET max_connections = 1000;”

– 调整查询参数
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET sort_buffer_size = ’16M’;”

### 5. 优化表结构
– 分区表设计
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE TABLE fgedu.order_partition (
order_id INT PRIMARY KEY,
user_id INT NOT NULL,
order_amount DECIMAL(10,2) NOT NULL,
order_status VARCHAR(20) NOT NULL,
order_date DATE NOT NULL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2026 VALUES LESS THAN (2027),
PARTITION p2027 VALUES LESS THAN (2028),
PARTITION p2028 VALUES LESS THAN (2029)
);”

### 6. 测试性能
– 执行压力测试
– 观察响应时间
– 验证性能优化效果

## 案例总结
– 成功优化了系统性能
– 调整了数据库参数
– 优化了表结构
– 提高了系统响应速度

Part05-风哥经验总结与分享

5.1 OceanBase SQL开发最佳实践

OceanBase SQL开发的最佳实践:

  • 遵循规范:按照SQL开发规范编写SQL语句,提高代码可读性和可维护性
  • 合理设计表结构:根据业务需求,合理设计表结构,避免冗余和不必要的字段
  • 使用索引:为经常用于查询条件的列创建索引,提高查询性能
  • 优化SQL语句:避免使用SELECT *,避免使用复杂的子查询,合理使用JOIN
  • 参数化查询:使用参数化查询,避免SQL注入
  • 批量操作:使用批量插入、更新和删除,减少网络开销
  • 分页查询:使用LIMIT子句进行分页,避免返回过多数据
  • 测试:对SQL语句进行充分的测试,确保其正确性和性能

5.2 OceanBase SQL优化技巧

OceanBase SQL优化的技巧:

  • 分析执行计划:使用EXPLAIN查看执行计划,识别性能瓶颈
  • 创建合适的索引:根据查询条件创建索引,避免过度索引
  • 优化SQL语句:简化SQL语句结构,减少不必要的操作
  • 更新统计信息:定期更新表的统计信息,帮助优化器生成正确的执行计划
  • 调整参数:根据系统情况,调整数据库参数
  • 使用分区表:对大表使用分区表,提高查询性能
  • 监控慢SQL:定期分析慢SQL,进行优化
  • 使用缓存:对频繁查询的结果使用缓存,减少数据库访问

5.3 OceanBase SQL开发工具推荐

OceanBase SQL开发的工具推荐:

  • ODC(OceanBase Developer Center):OceanBase官方开发工具,支持SQL编辑、执行、调试等功能
  • Navicat:通用数据库管理工具,支持OceanBase
  • DBeaver:开源数据库管理工具,支持OceanBase
  • SQLyog:MySQL客户端工具,可用于连接OceanBase
  • obclient:OceanBase命令行客户端,用于执行SQL语句
风哥提示:SQL语言是OceanBase数据库的核心,掌握SQL开发和优化技巧对于DBA人员和开发人员来说非常重要。建议多学习SQL语法和优化方法,提高SQL编写和优化的能力。学习交流加群风哥微信: itpux-com

SQL开发建议:在SQL开发中,要注重代码的可读性和可维护性,遵循SQL开发规范,合理设计表结构和索引,优化SQL语句,提高查询性能。同时,要注意SQL安全,防止SQL注入等安全问题。更多学习教程公众号风哥教程itpux_com

风哥提示:SQL优化是一个持续的过程,需要定期分析慢SQL,调整索引和SQL语句,优化数据库参数,提高系统性能。同时,要根据业务需求的变化,不断调整和优化SQL语句,确保系统的高效运行。from OceanBase视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息