为什么'是空的'比'长度()= 0'慢100倍在blob列?

时间:2014-11-07 09:15:22

标签: sql sqlite

我有一个~90 MB的数据库,主要由消息附件组成,包括BLOB列content,用于存储二进制附件数据。

我认为在BLOB上创建索引是不明智的,因此除了自动索引之外没有任何索引。

为获取空的附件,我比较了以下查询:

SELECT message_id FROM attachments WHERE content IS NULL;

SELECT message_id FROM attachments WHERE length(content) = 0;

导致我的用例中包含相同的行。

为什么第一个需要250ms而第二个只需1-2ms(两者都在SSD上)?这背后的原因是什么?有隐藏的长度索引还是什么?任何洞察力都赞赏。

其他信息

  1. 两种情况下的EXPLAIN QUERY PLAN都是

    0 | 0 | 0 | SCAN TABLE附件

  2. 否定IS NOT NULLlength() != 0导致相同的性能差异为250毫秒与2毫秒。

  3. 在仅包含{NULL}列WHERE content IS NULL AND length(content) = 0;的组合查询中需要250毫秒而WHERE length(content) = 0 AND content IS NULL;需要2毫秒。

1 个答案:

答案 0 :(得分:4)

这些只是不同的查询:LENGTH是一个返回的标量函数(参见here

(i)NULL如果输入为NULL
(ii)0如果输入是一个零长度的字符串(或者如果它可以转换为字符串,则为resp。)。

因此,条件length(content)=0对于内容为空字符串为true,而在内容为NULL时为false(因为与NULL的比较始终为false)。

基于此,我猜你的表包含几个NULL字段,只有少数实际包含一个值。您的第二个附加信息也支持这一点,您可以说IS NOT NULL表现出相似的效果。