On Wed, Mar 23, 2011 at 8:49 PM, Brian Neal <bgn...@gmail.com> wrote:
> items = Post.objects(filter=forum__topic__in=forums).order_by('-
> topic__update_date', '-update_date').select_related(# as before)[:30]
>
> But this had the same result as before. I checked the resulting SQL,
> and it looked right, so I did an explain and it was pretty much as
> before. It decided not to use the index.

bummer :-(


> So I broke it up into two queries:
>
> topic_ids = list(Topic.objects.filter(forum__in=forums).order_by(
>        '-update_date').values_list('id', flat=True)[:30])
> items = Post.objects.filter(topic__in=topic_ids).select_related(# as
> before)[:30]

did you try:

items = 
Post.objects.filter(topic__in=Topic.objects.filter(forum__in=forums).order_by('-update_date')[:30]).select_related(#
as before)[:30]


IOW: use the first queryset for the '__in' clause, no need to flatten
to a list of IDs.  that allows the ORM to weave a subselect (see
http://docs.djangoproject.com/en/1.3/ref/models/querysets/#in).
unfortunately, the docs also warn about the less-than-ideal MySQL
optimizer, so in many cases it turns to be faster to do just like you
did.  (i guess that specially in these limited-size queries).

-- 
Javier

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to