Performance SQLITE运算符“=&引用;与“比较”&书信电报;及>&引用;性能差异

Performance SQLITE运算符“=&引用;与“比较”&书信电报;及>&引用;性能差异,performance,sqlite,operators,Performance,Sqlite,Operators,我的sql查询的性能有一个奇怪的问题。当我在左连接查询中使用操作符=时,大约需要30.514分钟-秒,但在使用的情况下,只需要1.717秒。以下是查询: -- data_filehash.size>4095 AND data_filehash.size<4097 || 1.717 seconds SELECT files.*, data_filehash.* FROM v_filesp AS files LEFT JOIN data_filehash ON files.id =

我的sql查询的性能有一个奇怪的问题。当我在左连接查询中使用操作符=时,大约需要30.514分钟-秒,但在使用<和>的情况下,只需要1.717秒。以下是查询:

-- data_filehash.size>4095 AND data_filehash.size<4097  || 1.717 seconds
SELECT files.*, data_filehash.* 
FROM v_filesp AS files 
LEFT JOIN data_filehash ON files.id = data_filehash.file AND data_filehash.size>4095 AND data_filehash.size<4097  
WHERE data_filehash.file IS NULL

-- data_filehash.size=4096 || 30.515 minutes
SELECT files.*, data_filehash.* 
FROM v_filesp AS files
LEFT JOIN data_filehash ON files.id = data_filehash.file AND data_filehash.size=4096  
WHERE data_filehash.file IS NULL
使用和>进行查询(更快)

最后的步骤是不同的,但这意味着什么?我怎样才能告诉db在第一次查询中应该使用第二个更好的算法呢?

更新,起初我误解了这一点,认为不等式比较要慢得多。这通常是人们所期望的。事实并非如此,所以让我们再来一次

通过不平等比较,引擎首先必须找到与条件大小>4095匹配的所有记录,很可能会有很多记录。可能有太多匹配项,引擎使用索引是徒劳的。可能会进行全表扫描

但是sqlite在查询中只能对每个表使用一个索引。如果不能在大小上使用索引,最好是在文件上使用索引。这种空比较可能会消除大量行,从而加快查询速度

使用相等比较要简单得多,因此看起来可以在size字段上使用索引,但这可能会消除比在is null上使用其他索引时少得多的行数


如果这仍然不能解释问题,您是否可以更新您的问题,以显示返回的记录数、file=4096的记录数和null
名称数

好的,现在它可以正确地进行相等比较。我添加了索引为的

SELECT files.*, data_filehash.* 
FROM v_filesp AS files 
LEFT JOIN data_filehash INDEXED BY index_file
ON files.id = data_filehash.file AND data_filehash.size=4096
WHERE files.c_dup=1 AND data_filehash.file IS NULL

谢谢e4c5

显示两个查询的输出。您可以发布表的架构吗?size有索引吗?如果我正确理解您的意思,那么使用=进行查询应该更快—这是逻辑;但在我的例子中,速度慢了30*60倍。为什么?我又试过了。
SEARCH TABLE files USING INDEX files_c_dup (c_dup=?)
SEARCH TABLE dirs USING INTEGER PRIMARY KEY (rowid=?)
SEARCH TABLE data_filehash USING INDEX index_file (file=?)
SELECT files.*, data_filehash.* 
FROM v_filesp AS files 
LEFT JOIN data_filehash INDEXED BY index_file
ON files.id = data_filehash.file AND data_filehash.size=4096
WHERE files.c_dup=1 AND data_filehash.file IS NULL