如果我在SQLite中使用blob字段作为主键,是否会遇到性能问题?

时间:2009-10-13 20:28:25

标签: sql performance sqlite

我有一个sqlite数据库,其中所有主键都是GUID。目前它们存储为固定长度的字符串,但我想将它们存储为blob,因为它简化了存储和检索数据的代码。我转换了部分数据库,一切都按预期运行。但是,我不确定我是否会遇到性能问题。

例如,像这样的语句在字符串上会比blob更快吗?

SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.parent_id

我的直觉说不,但这并不意味着什么。

3 个答案:

答案 0 :(得分:12)

找出答案的最佳方法是针对探查器/ SQLite的计时器运行查询。设置测试并使用字符串运行1000次查询,然后作为blob运行1000次。获胜者是最快的。

直觉是一回事,硬数据是另一回事。

答案 1 :(得分:1)

我认为AIEE如果我是你,我会在SQLITE上将GUID存储在一对Integer类型中(SQLITE INTEGER是64位)。

但是在这种情况下,blob实际上可能会更好。

LFSR是对的,对其进行分析。

答案 2 :(得分:-1)

为什么你不应该使用它

主键通常被编入索引并用于排序。无法对BLOB建立索引,这使得它成为所有数据类型中最慢的。事实上,它是最糟糕的选择,因为主键和大多数数据库,包括SQL99标准,都不允许它。

BLOB的问题是数据库不知道它的数据类型(BLOB只能用于未定义的任何内容,例如徽标,图像,word文档,只能存储为二进制数据)。因此它无法优化它。另一个问题是显示。 blob不能简单地显示为文本。

大多数SQL实现不允许比较BLOB个字段,但SQLite允许它。但是,它会将您比较的任何内容转换为blob,然后逐位进行比较。

最佳选择

SQLite中主键列的最佳选择是使用此处所述的INTEGER PRIMARY KEY; http://www.sqlite.org/lang_createtable.html#rowid它可以提供最佳性能(它已作为rowid列存在,它只是别名)。

结论

回答你的问题:是的,它严重影响了性能。但更重要的是,它会很难很好地管理您的表格。使用INTEGER PRIMARY KEY,它确实是最好的,保证唯一且速度非常快。