我正在使用对象数据库 (ZODB) 来存储许多对象之间的复杂关系,但遇到了性能问题。因此,我开始构建索引以加快对象检索和插入。这是我的故事,希望对你有所帮助。
最初,当我将一个对象添加到数据库中时,我会将其插入专用于该对象类型的分支中。为了防止多个对象代表同一个实体,我添加了一个方法,该方法将遍历分支中的现有对象以查找重复项。这起初是可行的,但随着数据库规模的增长,将每个对象加载到内存中并检查属性所花费的时间呈指数增长,令人无法接受。
为了解决这个问题,我开始根据对象中的属性创建索引,以便在添加对象时将其保存在类型分支以及属性值索引分支中。例如,假设我正在保存一个具有属性 firstName = 'John' 和 lastName = 'Smith' 的人员对象,该对象将被附加到人员对象类型分支,并且还将被附加到属性索引分支内的列表中,带有键'约翰”和“史密斯”。
这节省了大量重复检查的时间,因为可以分析新对象并且只需要检查与属性索引相交的对象集。
但是,我很快遇到了另一个关于更新对象时的处理问题。索引需要更新以反映它们可能不再准确的事实。这需要记住旧值以便可以直接访问它们并删除对象,或者迭代属性类型的所有值以便找到然后删除对象。无论哪种方式,性能都很快开始再次下降,我无法找到解决它的方法。
你以前有过这样的问题吗?你做了什么解决它,或者这只是我在使用 OODBMS 时必须处理的事情?
提前感谢您的帮助。