1

我有一个关于 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命令会比=. 关于为什么会这样的任何想法?是否有另一种方式来构建我的查询?

4

2 回答 2

1

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

当您使用s.compoundID = (SELECT compoundID ...)时,数据库执行子查询,但只获取返回的第一个值。这就像你写了类似的东西一样s.compoundID = 11

于 2013-11-14T08:19:07.400 回答
-1

我使用sql工具来解释这两个sql。发现:当使用=时,它显示在此处输入图像描述

使用时显示在此处输入图像描述

我试着从 mysql_dev_doc 中寻找一些细节,但我什么也没找到。

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

我对吗?我希望如此……哈哈

于 2013-11-14T03:50:47.860 回答