性能优化 #

一、性能优化概述 #

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