为什么Django ORM比原始SQL慢这么多

4
我有以下两段代码:
首先是 SQL 代码:
self.cursor.execute('SELECT apple_id FROM main_catalog WHERE apple_id=%s', apple_id)
if self.cursor.fetchone():
    print '##' 

接下来,在Django中:
if Catalog.objects.filter(apple_id=apple_id).exists():
    print '>>>'

用第一种方式做,在 100k 条目的循环中大约比第二种方式快 4 倍。是什么导致 Django 如此慢呢?

哇,这真是令人惊讶。 - Barney Szabolcs
类似len(Catalog.objects.filter(apple_id=apple_id)[:1])这样的写法性能更好吗? - Barney Szabolcs
1个回答

8

通常ORM为每行数据实例化一个完整的对象并返回它。而你的原始SQL没有这样做,因此不会产生额外的开销。对于大型结果集,如果你不打算使用对象,最好绕过ORM。


1
ORM是“对象关系映射”的缩写。为每一行实例化一个完整的对象可能会带来一些“麻烦”,但这正是ORM的本质所在。另一个提问者进行了一些测试,并确定Django 1.8+在性能方面取得了更大的改进,与使用原始SQL的方式相当。 - Bobort
在这种情况下,我们不应该有一个大的结果集,如果没有其他问题,ORM 应该在 select 后面加上 limit 1。 - Barney Szabolcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接