使用pickleType和关系之间是否存在严重的性能差异?

时间:2013-11-18 23:08:19

标签: python performance sqlalchemy flask-sqlalchemy

假设有一张人员表。让我们说系统中有1000多个。每个人物品都有以下字段:姓名,电子邮件,职业等。

我们希望允许People项目有一个名称列表(昵称和此类),其中没有其他数据与名称相关联 - 名称只是一个字符串。

这正是pickleType的用途吗?使用pickle类型和创建Name表以使People的名称字段成为一对多关系之间有什么样的性能优势?

1 个答案:

答案 0 :(得分:0)

是的,这是sqlalchemy的PickleType字段documented very well here的一个很好的用例。使用它有明显的性能优势。

使用您的示例,假设您有一个使用一对多数据库外观的People项。这要求数据库执行JOIN来收集子元素;在这种情况下,Person's昵称,如果有的话。但是,您可以在python代码中使用本机对象,而无需反序列化pickle。

相比之下,字符串列表可以被腌制并存储为数据库中的PickleType,它们在内部存储为LargeBinary。查询Person只需要数据库命中一个表,没有JOIN,这将导致极快的数据返回。但是,您现在需要将每个项目反剔回到python对象中的“成本”,如果您不存储本机数据类型,这可能很重要;例如string,int,list,dict。

此外,通过在数据库中存储pickle,您也失去了底层数据库在给定WHERE条件的情况下过滤结果的能力;特别是整数和日期时间对象。本机数据库调用可以返回给定数字或日期范围内的值,但是没有关于表示这些项的字符串的概念。

最后,对单个pickle的简单更改可能允许在应用程序中执行任意代码。这不太可能,但必须说明。

恕我直言,存储泡菜是存储某些类型数据的好方法,但在数据类型方面会有很大差异。我可以告诉你,我们在我们的模式中使用它非常广泛,甚至在几个数十亿条记录的表上相当不错。