Sqlite在WHERE x IN中使用'in'或'='(选择...)

时间:2013-11-14 02:52:49

标签: sql sqlite

我有一个sqlite应用程序的查询

SELECT * FROM compounds c JOIN spectraData s ON c.rowid = s.compoundID 
WHERE s.compoundID = (SELECT compoundID FROM spectraData WHERE mz = 171);

两个表格结构为

CREATE TABLE compounds (name VARCHAR(200), cas VARCHAR(15), formula VARCHAR(100), peakProduct INT)
CREATE TABLE spectraData (compoundID INT, mz INT, intensity INT)

分别有101,595和20,985,713行和一个索引:

CREATE INDEX mz_sort ON spectraData ("mz")

当我使用s.compoundID = (SELECT ...的查询时,它需要5.6毫秒,但如果代码更改为s.compoundID IN (SELECT ...,则它会上升到44.8毫秒。为什么两者之间有这么大的差异?

我认为in命令会比=更快。有关为什么会出现这种情况的任何想法?有没有其他方法来构建我的查询?

2 个答案:

答案 0 :(得分:1)

当您使用s.compoundID IN (SELECT compoundID ...)时,数据库将执行子查询并使用所有返回的值与s.compoundId进行比较。 假设子查询返回五个值,这与您编写s.compoundID IN (11, 22, 33, 44, 55)之类的内容相同。

使用s.compoundID = (SELECT compoundID ...)时,数据库会执行子查询,但只返回第一个值。 这与您编写类似s.compoundID = 11的内容相同。

答案 1 :(得分:-1)

我使用sql工具来解释这两个sql。 发现: 当use =时,它会显示enter image description here

使用时,会显示enter image description here

我试着从mysql_dev_doc中查找一些细节,但我一无所获。

但是根据解释的结果,我想,当使用“=”时,它将为每个表格化合物比较处理子查询一次,但是当使用“in”时,只需处理子查询一次,并使用子查询结果从表格化合物中查找数据。

我是对的吗? 我希望如此...哈哈