在使用ORM时,难免会遇到sql的性能问题,今天分享给大家一个可以优化sql的技巧,使用django提供的select_related 功能做优化
class Question(models.Model):
"""
问题表
"""
user = models.ForeignKey(User,related_name="question",on_delete=models.CASCADE,verbose_name='问题提问者')
title = models.CharField(max_length=255,verbose_name='标题')
is_draft = models.BooleanField(default=True,verbose_name='是否是草稿')
status = models.CharField(max_length=10,choices=(('open','开启'),('close','关闭')),default='open')
content = MarkdownxField(verbose_name='内容')
比如我们在对Question表做查询时,如果我们的表中有外键,user字段就是外键关联,当我们在进行查询时例如:
Question.objects.filter(status=‘open’)
django将ORM语句翻译成SQL是这样的:
SELECT * FROM
question
WHEREquestion
.status
= ‘open’
SELECT * FROMuser
WHEREid
= ‘1’
显而易见,django执行了两条sql语句,因为user字段是外键,需要查询。
但是我们如果想减少sql查询的次数,期望用一条sql语句就能查到question和对应的外键user的信息呢? 好消息是django提供了一个好方法供我们完成我们的想法,在ORM查询时加入一个方法即可,如下
Question.objects.filter(status=‘open’).select_related(‘user’);
再让我们看看翻译的sql语句是什么样的
SELECT * FROM
question
INNER JOINuser
ON (question
.user_id
=user
.id
) WHEREquestion
.status
= ‘open’ ;
此时Django会使用内连查询,将我们question和user信息转为一行输出,减少了sql查询次数,如果我们的数据库有成千上万的数据,那么sql优化还是很显著的~