Django ORM查询性能



我正试图为我的django应用程序找到最好的django查询。我使用默认的Sqlite DB作为后端。我使用timeit来查找查询所花费的时间。

>>> import timeit
>>>
>>> setup_arg = 'from .models import AwsConsoleAccess'
>>> stmt1 = """AwsConsoleAccess.objects.filter(request_id='8548a2d5-4bb7-4fa9-add2-a41219dc8785')"""
>>> stmt2 = """AwsConsoleAccess.objects.filter(request_id='8548a2d5-4bb7-4fa9-add2-a41219dc8785').values('status')"""
>>>
>>>
>>> print(timeit.timeit(setup=setup_arg, stmt=stmt1, number=100) * 1000, 'ms')
7.873513997765258 ms
>>> print(timeit.timeit(setup=setup_arg, stmt=stmt2, number=100) * 1000, 'ms')
11.816384001576807 ms

SQL查询执行:


>>> print(AwsConsoleAccess.objects.filter(request_id='8548a2d5-4bb7-4fa9-add2-a41219dc8785').query)
SELECT "aws_console_awsconsoleaccess"."created",.....(all fields) FROM "aws_console_awsconsoleaccess" WHERE "aws_console_awsconsoleaccess"."request_id" = 8548a2d54bb74fa9add2a41219dc8785
>>> print(AwsConsoleAccess.objects.filter(request_id='8548a2d5-4bb7-4fa9-add2-a41219dc8785').values('status').query)
SELECT "aws_console_awsconsoleaccess"."status" FROM "aws_console_awsconsoleaccess" WHERE "aws_console_awsconsoleaccess"."request_id" = 8548a2d54bb74fa9add2a41219dc8785

理论上,select field from table应该比select * from table运行得快,但我的结果并没有反映出来。

  1. 我做我的测试正确吗?
  2. 有没有其他的方法来测试两个查询在Django ORM之间的性能?

您没有考虑到QuerySets是惰性的这一事实,即当您创建一个查询集时,没有对数据库进行实际查询。只有在实际需要查询结果时,查询才会运行。

因此,当您编写Model.objects.filter(...)时,所做的就是创建一个查询。相反,您应该强制对查询集进行求值,例如将其转换为列表。这将实际运行查询并为您提供更准确的结果:

list(Model.objects.filter(...))

最新更新