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开发的规范:
## 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性能调优的策略:
## 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查询开发
## 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语句优化
## 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监控
## 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审计
## 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开发实战案例
## 案例背景
– 生产环境: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优化实战案例
## 案例背景
– 生产环境: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性能调优实战案例
## 案例背景
– 生产环境: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语句
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
