一尘不染

BLOB的'length()IS NULL'是否等效且比'IS NULL'更快?

sql

我在SSD上有一个约90 MB的SQLite数据库,该数据库主要由包含BLOB列内容的消息附件组成,该附件存储二进制附件数据。

现在我发现以下查询

SELECT message_id FROM attachments WHERE length(content) IS NULL;

比原始速度快500倍(0.5毫秒对250毫秒)

SELECT message_id FROM attachments WHERE content IS NULL;

这两个查询是否相等,这是真的吗?

附加信息

  1. 除自动索引外,不涉及任何索引。
  2. 它不是缓存。可以从任意数量的SQLite进程以任意顺序无限制地复制结果。

阅读 105

收藏
2021-05-23

共1个答案

一尘不染

在SQLite中,每个列值的长度和类型存储在row的开头。这样可以优化length()typeof()功能,以避免加载实际值。

IS NULL运算符没有这种优化(尽管可以实现它)。

2021-05-23