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是多对多的字段,默认加载全部外键字段,指定字段可减少内存开销
优缺点
优点:提高查询性能。
缺点:空间换时间,增大内存开销。

浙公网安备 33010602011771号