我有一个~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上)?这背后的原因是什么?有隐藏的长度索引还是什么?任何洞察力都赞赏。
其他信息
两种情况下的EXPLAIN QUERY PLAN
都是
0 | 0 | 0 | SCAN TABLE附件
否定IS NOT NULL
与length() != 0
导致相同的性能差异为250毫秒与2毫秒。
WHERE content IS NULL AND length(content) = 0;
的组合查询中需要250毫秒而WHERE length(content) = 0 AND content IS NULL;
需要2毫秒。答案 0 :(得分:4)
这些只是不同的查询:LENGTH
是一个返回的标量函数(参见here)
(i)NULL
如果输入为NULL
(ii)0
如果输入是一个零长度的字符串(或者如果它可以转换为字符串,则为resp。)。
因此,条件length(content)=0
对于内容为空字符串为true,而在内容为NULL
时为false(因为与NULL
的比较始终为false)。
基于此,我猜你的表包含几个NULL
字段,只有少数实际包含一个值。您的第二个附加信息也支持这一点,您可以说IS NOT NULL
表现出相似的效果。