2014-02-14 2 views
1

나는 두 모델 이제 장고 또는

class Video(models.Model): 
    name = models.CharField(max_length=200) 

class Store(models.Model): 
    name = models.CharField(max_length=200) 
    videos = models.ManyToManyField('Video') 

나는 다음의 검색어를하고 그 쿼리

qs = Video.objects.filter(Q(store__name="blockbuster") | Q(pk__in=[1,2,3,4])) 
print qs.query 

다음을 인쇄 다음 한 절 (외부 대신에 노동 조합의 참여 왼쪽) 느린 쿼리를 생성 쿼리가 생성됩니다. 나는이 쿼리 상에 설명 계획을 수행 할 때

SELECT `video`.`id`, `video`.`name`, 
FROM `video` LEFT OUTER JOIN `store` ON (`store`.`video_id` = `video`.`id`) 
WHERE (`store`.`name` = "blockbuster" OR `video`.`id` IN (1, 2, 3, 4)) 

, MySQL은 전체 테이블은 가능한 모든 인덱스를 추가에도 불구하고, 비디오 테이블에 스캔 않습니다. 이것은 나에게 많은 비용이 든다. 어떻게하면 MySQL을 강제로 색인을 사용하거나 django를 사용하여 UNION ALL을 사용하는 대신 'OR'를 사용하는 것이 더 빠릅니까?

+0

당신이 두 개의 별도의 컬렉션을 가져 오는 한 후 오히려 충돌을 제거 간주 되세요 Q() | Q()를 사용하는 것보다? – schillingt

답변

0

STORE_NAME에 대한 인덱스를 추가,

name = models.CharField(max_length=200, db_index=True) 

편집 :

당신은을 통해 기존의 인덱스를 문서화 할 수 있습니다

show index from video; 
show index from store; 
+0

OP는 그가 인덱스를 갖고 있지만 MySQL은 분명히 인덱스를 사용하지 않는다고 말합니다. – mustaccio

관련 문제