首页 |  我的博客 |  查看该博主内容分类 | 

django模型存在外键的情况下,如何提高orm查询性能?

前言:平时使用get()、filter()或all()时,如果涉及外键查询,会先查询A表的外键字段B表的id,然后通过id查询B表的数据。如果数据特别多时,会严重影响查询性能。

原理

通过mysql的inner join内联表的方式进行查询,sql语句如:select B.name from A INNER JOIN B on A.b_id=B.id where A.id=1,通过内联之后会减少很多数据的查询,从而提高了性能。

解决方法

一对一、一对多使用:select_related(可指定要加载的字段)

ATable.objects.select_related('b').filter(b_id__name='张三')  # 参数b是一对一或一对多的字段,默认加载全部外键字段,指定字段可减少内存开销

多对多使用:prefetch_related(可指定要加载的字段)

ATable.objects.prefetch_related('b').filter(b_id__name='张三')  # 参数b是多对多的字段,默认加载全部外键字段,指定字段可减少内存开销

优缺点

优点:提高查询性能。

缺点:空间换时间,增大内存开销。

posted @ 2023-10-20 15:06  Z哎呀  阅读(141)  评论(0)    收藏  举报