Django的orm真的很好用,现在已经用的很熟了,但是在使用的过程中也发现了一些细微的差别,今天在优化时就发现了一个小问题。
如有张表是这么设计的:
class Tree(models.Model):
name = models.CharField(max_length=32)
create_time = models.DateTimeField()
parent = models.ForeignKey("self", null=True)
这是一个树形结束的表,它可以有父节点,也可以没有,如果我们想知道无节点的节点个数,可以有以下两种写法:
1. Tree.objects.exclude(parent=None).count()
2. Tree.objects.filter(parent__isnull=False).count()
它们所对应的SQL分别是:
(0.003) SELECT COUNT(*) FROM `tree` WHERE NOT (`tree`.`parent_id` IS NULL); args=()
(0.002) SELECT COUNT(*) FROM `tree` WHERE `tree`.`parent_id` IS NOT NULL; args=()
发现执行时间差别差不是很大,在很多应用中都会使用where column is not null查询一小部分需要操作的数据而由于is null条件无法使用索引而引起全表扫描。询问了一下DBA, null这种结构会使索引失效,以致查询缓慢。