簡體   English   中英

在Google App Engine中進行大型IN查詢的有效方法?

[英]Efficient way to do large IN query in Google App Engine?

用戶在他的移動設備上訪問他的聯系人。 我想將所有電話號碼(例如250)發送回服務器,然后查詢具有匹配電話號碼的任何用戶實體。

用戶具有索引的電話字段。 所以我做User.query(User.phone.IN(phone_list)) ,但我只是看了AppStats,這真是太貴了。 對於這一項操作,我花了250次讀取,這是我希望用戶經常做的事情。

有哪些替代方案? 我想我可以將User實體的id值設置為他的電話號碼(即創建用戶時我會用user = User(id = phone_number) ),然后通過ndb.get_multi(phones)直接獲取密鑰,但是我也想用電子郵件執行相同的查詢。

有任何想法嗎?

您可以像這樣創建一個PhoneUser模型:

from google.appengine.ext import ndb

class PhoneUser(ndb.Model):
  number = ndb.StringProperty()
  user = ndb.KeyProperty()

class User(ndb.Model):
  pass

u = User()
u.put()

p = PhoneUser(id='123-456-7890', number='123-456-7890', user=u.key)
p.put()

u2 = User()
u2.put()

p2 = PhoneUser(id='555-555-5555', number='555-555-5555', user=u2.key)

result =  ndb.get_multi([ndb.Key(PhoneUser, '123-456-7890'), ndb.Key(PhoneUser, '555-555-5555')])

我認為在這種情況下會有效。 只要您更新用戶,就必須添加/刪除PhoneUser模型。 你可以使用post hooks來做到這一點: https//developers.google.com/appengine/docs/python/ndb/modelclass#Model__post_delete_hook

我誤解了你的部分問題,我以為你發的是一個給你250個實體的查詢。

我現在看到問題是什么,你發出了一個包含250個電話號碼列表的IN查詢,在幕后,數據存儲區實際上正在進行250次單獨查詢,這就是為什么你要獲得250個讀取操作。

我想不出辦法避免這種情況。 我建議不要搜索很長的電話號碼列表。 這似乎是用戶首次使用該手機登錄時需要執行的操作。 嘗試找到一些方法來存儲結果並再次避免查詢。

沒有有效的方法來進行IN查詢。 所以反而避免一起。

怎么樣?

反轉查詢,而不是找到屬於這個家伙電話列表的所有人。

嘗試

發現在他們的名單這個用戶phoneid所有的人。

然而,這並非沒有一些額外的費用。 每個用戶的phonelist都被存儲和索引。

class User(ndb.Model):
  phoneList = ndb.PropertyList()
  phone_id= ndb.StringProperty()

select from where User.phoneList = :this_phone_number

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM