性能优化 #
一、性能优化概述 #
1.1 性能优化方向 #
text
性能优化方向:
├── 查询优化
├── 索引优化
├── 配置优化
├── 硬件优化
└── 架构优化
1.2 性能指标 #
| 指标 | 说明 |
|---|---|
| 查询响应时间 | 查询执行时间 |
| 吞吐量 | 每秒处理请求数 |
| 并发数 | 同时处理连接数 |
| 资源利用率 | CPU、内存、磁盘使用率 |
二、查询优化 #
2.1 使用EXPLAIN分析 #
sql
EXPLAIN SELECT FROM Person WHERE name = 'Tom'
2.2 使用PROFILE分析 #
sql
PROFILE SELECT FROM Person WHERE name = 'Tom'
2.3 查询优化原则 #
text
查询优化原则:
├── 使用索引
├── 限制返回字段
├── 限制返回数量
├── 避免全表扫描
└── 优化JOIN操作
2.4 使用索引 #
sql
CREATE INDEX Person.name UNIQUE
SELECT FROM Person WHERE name = 'Tom'
2.5 限制返回字段 #
sql
SELECT name, email FROM Person WHERE status = 'active'
2.6 使用LIMIT #
sql
SELECT FROM Person WHERE status = 'active' LIMIT 100
2.7 避免SELECT * #
sql
SELECT name, age, email FROM Person
2.8 使用RID查询 #
sql
SELECT FROM #12:0
2.9 优化子查询 #
sql
LET $companies = SELECT FROM Company WHERE industry = 'Tech'
SELECT p.name, $c.name AS companyName
FROM Person p
LET $c = (SELECT FROM $companies WHERE @rid = p.employer)
WHERE $c.size() > 0
三、索引优化 #
3.1 选择合适的索引类型 #
text
索引选择指南:
├── 唯一字段 -> UNIQUE
├── 频繁查询字段 -> NOTUNIQUE
├── 文本搜索 -> FULLTEXT
├── 等值查询优先 -> HASHINDEX
└── 范围查询 -> SB-Tree
3.2 复合索引设计 #
sql
CREATE INDEX idx_person_city_age ON Person (city, age) NOTUNIQUE
SELECT FROM Person WHERE city = 'Beijing' AND age > 30
3.3 索引维护 #
sql
REBUILD INDEX Person.name
3.4 索引统计 #
sql
SELECT
name,
size,
ROUND(size * 1.0 / (SELECT COUNT(*) FROM Person), 2) AS selectivity
FROM metadata:indexes
WHERE className = 'Person'
3.5 删除无用索引 #
sql
DROP INDEX Person.unused_field
四、内存优化 #
4.1 JVM内存配置 #
bash
export ORIENTDB_OPTS_MEMORY="-Xms4G -Xmx8G"
4.2 内存配置参数 #
| 参数 | 说明 | 建议值 |
|---|---|---|
| -Xms | 初始堆内存 | 物理内存的50% |
| -Xmx | 最大堆内存 | 物理内存的75% |
| -XX:NewSize | 新生代大小 | 堆内存的30% |
| -XX:MaxNewSize | 最大新生代 | 堆内存的30% |
4.3 缓存配置 #
xml
<properties>
<entry name="memory.chunk.size" value="134217728"/>
<entry name="memory.directMemory.safeMode" value="true"/>
</properties>
4.4 页面缓存 #
sql
ALTER DATABASE SET cache.level1.enabled = true
ALTER DATABASE SET cache.level1.size = 10000
五、磁盘优化 #
5.1 使用SSD #
text
SSD优势:
├── 随机读写性能高
├── IOPS更高
├── 延迟更低
└── 适合数据库场景
5.2 磁盘配置 #
xml
<properties>
<entry name="storage.diskCache.size" value="524288"/>
<entry name="storage.wal.maxSize" value="524288"/>
</properties>
5.3 定期压缩 #
sql
COMPACT DATABASE
5.4 集群优化 #
sql
ALTER CLUSTER person_east GROWTH_FACTOR 20
六、连接池优化 #
6.1 连接池配置 #
java
OrientDBConfig config = OrientDBConfig.builder()
.addDBConfig("db.pool.min", 5)
.addDBConfig("db.pool.max", 50)
.addDBConfig("db.pool.idleTimeout", 300000)
.addDBConfig("db.pool.maxWait", 5000)
.build();
6.2 连接池参数 #
| 参数 | 说明 | 默认值 |
|---|---|---|
| db.pool.min | 最小连接数 | 1 |
| db.pool.max | 最大连接数 | 100 |
| db.pool.idleTimeout | 空闲超时(ms) | 300000 |
| db.pool.maxWait | 最大等待(ms) | 0 |
七、批量操作优化 #
7.1 批量插入 #
sql
BEGIN
INSERT INTO Person SET name = 'Person1'
INSERT INTO Person SET name = 'Person2'
INSERT INTO Person SET name = 'Person3'
COMMIT
7.2 使用UNWIND #
sql
LET persons = [
{'name': 'Person1'},
{'name': 'Person2'},
{'name': 'Person3'}
]
FOREACH ($p IN $persons) {
INSERT INTO Person SET name = $p.name
}
7.3 禁用索引临时 #
sql
ALTER INDEX Person.name DISABLE
INSERT INTO Person SET name = 'Person1'
ALTER INDEX Person.name ENABLE
7.4 批量大小建议 #
text
批量大小建议:
├── 小批量:100-1000条
├── 中批量:1000-10000条
├── 大批量:使用事务分批
└── 避免单条操作
八、图查询优化 #
8.1 限制遍历深度 #
sql
TRAVERSE out('KNOWS') FROM #12:0 MAXDEPTH 3
8.2 使用索引 #
sql
CREATE INDEX KNOWS_out_in ON KNOWS (out, in) NOTUNIQUE
8.3 避免全图遍历 #
sql
SELECT FROM Person WHERE name = 'Tom'
SELECT out('KNOWS') FROM (SELECT FROM Person WHERE name = 'Tom')
8.4 使用RID #
sql
SELECT out('KNOWS') FROM #12:0
九、监控与分析 #
9.1 查看数据库状态 #
sql
SELECT FROM metadata:database
SELECT properties FROM metadata:database
9.2 查看活跃连接 #
sql
SELECT FROM metadata:connections
9.3 查看活跃事务 #
sql
SELECT FROM metadata:transactions
9.4 查看集群状态 #
sql
SELECT name, records, size FROM cluster:*
ORDER BY size DESC
9.5 慢查询日志 #
sql
ALTER DATABASE SET sql.slowQueryThreshold = 1000
十、配置优化 #
10.1 服务器配置 #
xml
<orient-server>
<network>
<protocols>
<protocol name="binary" implementation="com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary">
<parameters>
<parameter name="network.binary.maxLength" value="65536"/>
</parameters>
</protocol>
</protocols>
</network>
<properties>
<entry name="db.pool.min" value="5"/>
<entry name="db.pool.max" value="50"/>
<entry name="cache.level1.enabled" value="true"/>
<entry name="cache.level1.size" value="10000"/>
</properties>
</orient-server>
10.2 关键配置参数 #
| 参数 | 说明 | 建议值 |
|---|---|---|
| db.pool.min | 最小连接池 | 5 |
| db.pool.max | 最大连接池 | 50 |
| cache.level1.enabled | 一级缓存 | true |
| cache.level1.size | 缓存大小 | 10000 |
| sql.slowQueryThreshold | 慢查询阈值 | 1000 |
十一、性能测试 #
11.1 基准测试 #
sql
SELECT COUNT(*) FROM Person
SELECT FROM Person LIMIT 1000
SELECT FROM Person WHERE name = 'Tom'
11.2 并发测试 #
bash
ab -n 1000 -c 10 http://localhost:2480/query/mydb/sql/SELECT%20FROM%20Person%20LIMIT%2010
11.3 性能监控工具 #
text
监控工具:
├── OrientDB Studio
├── JMX Console
├── Prometheus + Grafana
└── 自定义监控脚本
十二、常见性能问题 #
12.1 查询慢 #
text
问题:查询响应慢
解决:
├── 检查是否使用索引
├── 使用EXPLAIN分析
├── 限制返回结果
└── 优化查询语句
12.2 内存不足 #
text
问题:OutOfMemoryError
解决:
├── 增加JVM内存
├── 优化查询减少内存使用
├── 使用分页查询
└── 检查内存泄漏
12.3 连接超时 #
text
问题:连接超时
解决:
├── 增加连接池大小
├── 调整超时设置
├── 检查网络状况
└── 优化查询性能
十三、最佳实践 #
13.1 查询最佳实践 #
text
查询最佳实践:
├── 使用索引
├── 限制返回字段
├── 使用LIMIT
├── 避免SELECT *
├── 使用RID查询
└── 优化子查询
13.2 索引最佳实践 #
text
索引最佳实践:
├── 为查询条件创建索引
├── 合理设计复合索引
├── 定期维护索引
├── 删除无用索引
└── 监控索引使用
13.3 配置最佳实践 #
text
配置最佳实践:
├── 合理分配内存
├── 使用SSD存储
├── 调整连接池
├── 启用缓存
└── 监控系统状态
十四、总结 #
性能优化要点:
| 方向 | 方法 |
|---|---|
| 查询优化 | 使用索引、限制返回 |
| 索引优化 | 选择合适类型、定期维护 |
| 内存优化 | JVM配置、缓存设置 |
| 磁盘优化 | 使用SSD、定期压缩 |
| 连接优化 | 连接池配置 |
恭喜你完成了OrientDB完全指南的学习!
最后更新:2026-03-27