Odoo性能优化是确保系统高效运行的关键,尤其在数据量大或业务复杂的场景下。以下是基于实际项目经验总结的具体方法和最佳实践,涵盖数据库、代码、视图、缓存等多个层面:
index=True
,但避免过度索引导致写操作变慢。self.env['ir.model.fields'].search([('index', '=', True)])
检查并删除无效索引。_parent_store=True
,结合parent_left
/parent_right
字段,将递归查询转为单次范围查询,效率提升显著。search
+write
批量更新记录,避免循环内单条操作(减少SQL执行次数)。offset
和limit
分页加载,降低内存压力。SELECT *
:在ORM中通过fields
参数限制返回字段,如search_read(fields=['name'])
。odoo.conf
中设置db_maxconn
(如100-150),根据并发量动态调整。innodb_buffer_pool_size
(占用70%内存)。gzip
压缩静态资源,减少网络传输。@api.depends
并合理设置store=True
(权衡存储与计算开销)。create()
和write()
替代循环单条处理,例如:# 批量更新:高效
self.env['sale.order'].search([('state', '=', 'draft')]).write({'priority': 'high'})
prefetch_fields
或手动预取关联记录,如records.mapped('related_field.id')
。ilike '%text'
等无法利用索引的操作,改用全文搜索或特定前缀。queue_job
模块或Celery处理后台任务(如报表生成、邮件发送)。odoo.tools.threading
管理多线程任务,避免阻塞主请求。
和
结构,加速渲染。gzip
。widget="image" options={'size': [100,100]}
),避免列表视图加载原图。@tools.ormcache
装饰器缓存计算结果,如:@api.model
@ormcache('date')
def _get_cached_data(self, date):
return self.search([('date', '=', date)]).mapped('amount')
- **缓存失效机制**:在依赖字段更新时调用`self.env[model].clear_caches()`。
odoo.conf
启用Redis,缓存高频访问数据(如配置参数、翻译)。Cache-Control: max-age=604800
)。_parent_store=True
,利用parent_left
/parent_right
字段,将递归查询转为高效的范围查询:SELECT * FROM product_category WHERE parent_left > 3 AND parent_right < 10; -- 获取子节点
queue_job
,防止阻塞主线程。ir.profile
记录分析SQL/Python耗时。log_level=debug
记录慢查询,针对性优化。优化方向 | 具体措施 | 适用场景 |
---|---|---|
数据库 | 索引优化、分页查询、连接池配置 | 高频查询/大数据集 |
ORM操作 | 批量写入、预取关联字段、异步任务 | 批量数据处理/复杂关联 |
视图渲染 | 精简XML结构、图片压缩、懒加载 | 界面加载缓慢 |
缓存机制 | ORM方法缓存、Redis集成、HTTP静态缓存 | 高频计算/静态资源 |
层级查询 | 启用_parent_store +范围查询 |
树形结构数据(如分类/组织架构) |
监控分析 | 内置Profiler、SQL日志分析、APM工具 | 性能瓶颈定位 |
store=True
的计算字段)。通过上述方法,可显著提升Odoo在高并发、大数据量下的响应速度。实际项目中建议结合性能分析工具定位瓶颈,优先解决TOP 3慢操作(如N+1查询、全表扫描),再逐步扩展优化范围。