【问题标题】:Will I run into performance issues if I use a blob field as primary key in SQLite?如果我在 SQLite 中使用 blob 字段作为主键,我会遇到性能问题吗?
【发布时间】:2009-10-13 20:28:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我的直觉说是的,但这并不意味着什么。
  • SQLite 可以索引 blob 吗?

标签: sql performance sqlite


【解决方案1】:

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

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

【讨论】:

  • 也可以尝试使用 BINARY,它比文本字符串更适合您的 GUID 数据。
  • Dominic:这是你做的吗?你的结果是什么?
  • 我运行了这种测试(通过 Qt 的 sqlite 驱动程序 sqlite3)并且搜索 36 个字符的字符串 UUID 比相应的 16 字节紧凑型 UUID blob 慢约 4%。我赞成字符串版本,因为它更容易调试。
  • 不错的答案,但不是一个真正有价值的答案。它被接受的事实表明实验已经进行(大概是由问题作者@lawrence-barsanti 进行的),如果是这样,非常希望分享结果! :-)
  • 对于任何想知道的人,我使用 Python 3 和 SQLite3 编写了这个测试:gist.github.com/caioariede/7d765aa37241e1ccd56d5bc1631a3d18
【解决方案2】:

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

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

LFSR 是对的,请分析一下。

【讨论】:

    【解决方案3】:

    为什么你不应该使用它

    主键通常被索引并用于排序。 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,它确实是最好的,保证独一无二,而且速度极快。

    【讨论】:

    • 其实BLOB可以在SQLite中被索引。
    • @Abel 关于为什么有人想要这样做......您可以通过使用具有两个 BLOB“键”和“值”的表将 SQLite 用作简单的 NOSQL 数据库。还有很多情况下,您希望将哈希码存储在索引列的表中。如果没有可索引的“二进制”类型,人们通常会做的是将哈希码存储为十六进制(或 base64)编码的字符串。这很好,除了浪费空间。
    • 虽然我不同意 Abel 的推理,但我认为他的回答是正确的。恕我直言,最好的解决方案是在表上有一个 INTEGER PRIMARY KEY,在 BLOB 上有一个唯一索引。 INTEGER PRIMARY KEY 使用 SQLite 的内部 ROWID,提供访问和操作数据的快速方法。
    • @KevinDelaney 这很有吸引力的主要原因是一种非常常见的主键类型是 UUID。如果您可以将 UUID 存储为数字而不是字符串,则可以节省 9 倍的空间。
    • IPAddresses、哈希、guid 等都是很棒的可索引 blob
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2012-01-14
    • 1970-01-01
    • 2022-01-24
    • 2021-09-13
    • 2016-09-14
    相关资源
    最近更新 更多