mirror of
https://github.com/django/django.git
synced 2025-08-03 10:34:04 +00:00
[1.5.X] Fixed #15361 - Documented performance considerations for QuerySet.get()
Thanks mmcnickle for the patch.
Backport of feaf9f279a
from master
This commit is contained in:
parent
6b1f73113a
commit
ffc649df88
2 changed files with 70 additions and 1 deletions
|
@ -132,6 +132,41 @@ Write your own :doc:`custom SQL to retrieve data or populate models
|
|||
</topics/db/sql>`. Use ``django.db.connection.queries`` to find out what Django
|
||||
is writing for you and start from there.
|
||||
|
||||
Retrieve individual objects using a unique, indexed column
|
||||
==========================================================
|
||||
|
||||
There are two reasons to use a column with
|
||||
:attr:`~django.db.models.Field.unique` or
|
||||
:attr:`~django.db.models.Field.db_index` when using
|
||||
:meth:`~django.db.models.query.QuerySet.get` to retrieve individual objects.
|
||||
First, the query will be quicker because of the underlying database index.
|
||||
Also, the query could run much slower if multiple objects match the lookup;
|
||||
having a unique constraint on the column guarantees this will never happen.
|
||||
|
||||
So using the :ref:`example Weblog models <queryset-model-example>`::
|
||||
|
||||
>>> entry = Entry.objects.get(id=10)
|
||||
|
||||
will be quicker than:
|
||||
|
||||
>>> entry = Entry.object.get(headline="News Item Title")
|
||||
|
||||
because ``id`` is indexed by the database and is guaranteed to be unique.
|
||||
|
||||
Doing the following is potentially quite slow:
|
||||
|
||||
>>> entry = Entry.objects.get(headline__startswith="News")
|
||||
|
||||
First of all, `headline` is not indexed, which will make the underlying
|
||||
database fetch slower.
|
||||
|
||||
Second, the lookup doesn't guarantee that only one object will be returned.
|
||||
If the query matches more than one object, it will retrieve and transfer all of
|
||||
them from the database. This penalty could be substantial if hundreds or
|
||||
thousands of records are returned. The penalty will be compounded if the
|
||||
database lives on a separate server, where network overhead and latency also
|
||||
play a factor.
|
||||
|
||||
Retrieve everything at once if you know you will need it
|
||||
========================================================
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue