写操作过多

1 投票
1 回答
559 浏览
提问于 2025-04-17 09:16

我正在开发一个目录应用程序,使用的是app-engine(python),但遇到了写操作过多的问题。首先,我有一个.NET脚本,它会遍历一个Excel文件,并把数据发布到我应用程序的一个页面上。当我运行这个脚本时,它处理了大约700条记录,但我已经用掉了75%的写操作配额。然后我又写了一个脚本,目的是给我的所有模型添加一个搜索字段,结果在大约20秒内,我的配额从75%一下子涨到了96%,还因为短时间内写操作太多而被暂时限制了配额。我觉得这个问题可能和索引有关,但我对python和appengine还不是很熟悉。以下是我的模型:

class AlumniEntry(db.Model):
    """Models an entry for a single alumni"""
    author = db.UserProperty()
    entered = db.DateTimeProperty(auto_now_add=True)
    title = db.StringProperty()
    first_name = db.StringProperty(required=True)
    first_name_search = db.StringProperty()
    maiden_name = db.StringProperty()
    maiden_name_search = db.StringProperty()
    spouse_name = db.StringProperty()
    spouse_name_search = db.StringProperty()
    grad_year = db.StringProperty(required=True)
    elementary = db.StringProperty(choices=('yes', 'no', 'idk'), default='idk')

class LastName(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='last_names')
    last_name = db.StringProperty(required=True)
    last_name_search = db.StringProperty()

class PhoneNumber(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='phone_numbers')
    number = db.PhoneNumberProperty(default=None)

class Email(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='emails')
    email = db.EmailProperty(default=None)
    email_search = db.EmailProperty(default=None)

class Address(db.Model):
    entry = db.ReferenceProperty(AlumniEntry, collection_name='addresses')
    street = db.StringProperty()
    street_search = db.StringProperty()
    city = db.StringProperty()
    city_search = db.StringProperty()
    state = db.StringProperty()
    state_search = db.StringProperty()
    zip_code = db.StringProperty()

class UserAuth(db.Model):
    added_by = db.StringProperty(required=True)
    user_id = db.StringProperty(required=True)

1 个回答

3

除非你在搜索时指定某个属性(或者用它来排序),否则将这些属性设置为不索引可以节省写入索引的时间。每个属性会被索引两次(一次是升序,一次是降序),除非这个属性的类型本身就是不需要索引的,或者你将它设置为 indexed=False

详细信息可以查看 这个链接

在你的情况下,如果 street_search 是用于搜索的 street 的标准化形式,那么将 street 标记为 indexed=False 可以节省两次写入。

撰写回答