我有一个sqlite数据库,其中所有主键都是GUID。目前它们存储为固定长度的字符串,但我想将它们存储为blob,因为它简化了存储和检索数据的代码。我转换了部分数据库,一切都按预期运行。但是,我不确定我是否会遇到性能问题。
例如,像这样的语句在字符串上会比blob更快吗?
SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.parent_id
我的直觉说不,但这并不意味着什么。
答案 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
,它确实是最好的,保证唯一且速度非常快。