2011-02-23 2 views
1

사용자가 등록한 후 Facebook의 어느 친구가 이미 내 서비스에 등록했는지 검색하려고합니다. 내 현재의 구현은 매우 CPU를 많이 사용 :GAE에서 큰 IN 쿼리 실행 (ID 목록이있는 사용자 검색)

for eachFriend in facebookFriends: 
    friendUser = User.get_by_key_name(eachFriend['id']) 
    if friendUser: 
    friendUsers.append(friendUser) 

내가 IN 연산자를 사용하여 쿼리를 최적화하는 시도 : IN 연산자의 최대 하위 쿼리가 30

같이

users = User.all().filter('id IN', idList).fetch(10) # the idList is the list of IDs for a users facebook friends 

이 방법은 실패

팁이 있습니까?

답변

1

IN 연산자를 사용하면 실제로 쿼리의 효율성이 떨어집니다. 각 친구에 대해 빠른 가져 오기 작업을 수행하는 대신 느린 쿼리 작업 (IN 및! = 필터가 백엔드에서 여러 쿼리로 나뉩니다) .

대신, 하나의 배치가 일치하는 모든 suers에 대한 가져 오기 수행

friendUsers = User.get_by_key_name([x['id'] for x in facebookFriends]) 

이 아직 존재하지 않는 친구를 위해 None 값으로 모든 친구의 목록을 반환합니다.

1

네, 등록 된 각 사용자의 친구를 ListProperty에 저장할 수 있습니다. 등록 할 때 해당 속성에 대해 = 쿼리를 사용하여 누가 나를 친구로 지 었는지 확인할 수 있습니다. =ListPropertiesreturn all entities having the filtered-on value anywhere in the list에 대한 쿼리이며 IN 쿼리와 같은 방식으로 하위 쿼리를 생성하지 않습니다.

일부 사용자의 친구가 몇 명인 경우 per-entity index limits에 유의하십시오.