我有一个SQLite数据库,其中所有主键都是GUID。目前它们被存储为固定长度的字符串,但我想将它们作为BLOB存储,因为这简化了存储和检索数据的代码。我已经转换了部分数据库,一切正常运行。但是,我不确定是否会遇到性能问题。
例如,像这样的语句在字符串上比在BLOB上更快吗?
SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.parent_id
我的直觉告诉我不行,但这并不真正意味着什么。
我有一个SQLite数据库,其中所有主键都是GUID。目前它们被存储为固定长度的字符串,但我想将它们作为BLOB存储,因为这简化了存储和检索数据的代码。我已经转换了部分数据库,一切正常运行。但是,我不确定是否会遇到性能问题。
例如,像这样的语句在字符串上比在BLOB上更快吗?
SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.parent_id
我的直觉告诉我不行,但这并不真正意味着什么。
最好的方法是使用分析器/SQLite定时器运行查询。设置一个测试,使用字符串运行查询1000次,然后使用blob 1000次运行查询。获胜者是最快的。
直觉和硬数据是两回事。
我认为如果我是你的话,我会将GUID存储在SQLITE的两个整数类型中(SQLITE INTEGER是64位)。
然而,在这种情况下,blob可能实际上效果更好。
LFSR是对的,进行性能分析。
主键通常是索引并用于排序的。 BLOB
无法进行索引,这使它成为所有数据类型中最慢的。实际上,它是最糟糕的选择,作为主键,包括 SQL99 标准在内的大多数数据库都不允许使用。
BLOB
的问题在于数据库不知道它的数据类型(BLOB
只适用于任何未定义的东西,比如标志、图像、Word 文档等只能存储为二进制数据)。因此,它无法进行优化。另一个问题是显示。BLOB 不能简单地显示为文本。
大多数 SQL 实现不允许比较 BLOB
字段,但 SQLite 允许。然而,它会将您要比较的任何内容转换为 BLOB,然后逐位进行比较。
INTEGER PRIMARY KEY
,如此处所述:http://www.sqlite.org/lang_createtable.html#rowid它提供了最佳性能(它已经作为 rowid
列存在,只是别名)。
回答你的问题:是的,它会严重影响性能。但更重要的是,它将使您很难管理表格。使用 INTEGER PRIMARY KEY
,确实是最好的选择,可以保证唯一性并具有极快的速度。