我有一个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
命令会比=
更快。有关为什么会出现这种情况的任何想法?有没有其他方法来构建我的查询?
答案 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)
使用时,会显示
我试着从mysql_dev_doc中查找一些细节,但我一无所获。
但是根据解释的结果,我想,当使用“=”时,它将为每个表格化合物比较处理子查询一次,但是当使用“in”时,只需处理子查询一次,并使用子查询结果从表格化合物中查找数据。
我是对的吗? 我希望如此...哈哈