连续 JOIN 和别名:执行顺序

Consecutive JOIN and aliases: order of execution

在从另一个 table 获取数据之前,我正在尝试使用全文搜索作为初步过滤器。接下来是连续的 JOIN 以进一步细化查询并混合匹配行(实际上主要 table 最多有 6 个 JOIN)。

第一个“过滤器”returns 有用的行的 ID,因此加入后我有一个子集可以继续。然而,我的问题是性能,我不了解 SQL 查询是如何在 SQLite.

中执行的

SELECT *
FROM mytbl AS t1
JOIN
(SELECT someid
    FROM myftstbl
    WHERE
    myftstbl MATCH 'MATCHME') AS prior
ON
    t1.someid = prior.someid
    AND t1.othercol = 'somevalue'

JOIN mytbl AS t2
ON
    t2.someid = prior.someid
    /* Or is this faster? t2.someid = t1.someid */

我对上述查询的思考过程是,首先,我们从 myftstbl table 检索匹配的 ID,并使用它们在主 table [=12= 上加入] 以获得子选择。然后我们再次加入主 table 的副本作为 t2。我不确定的部分是哪种方法会更快:使用来自比赛的 ID,还是来自 t2?

换句话说:当我在第二个 JOIN 中引用 t1.someid 时,它是否只包含第一个 JOIN 之后的 someids(所以只包含 prior 和那些 t1.othercol = 'somevalue) 或它是否包含整个原始 table 的所有原始 someid

您可以假设所有列都已编入索引。事实上,当我使用一种或另一种方法时,我发现 EXPLAIN QUERY PLAN 每个查询都使用了不同的索引。所以两者肯定是有区别的。

查询应简化为

SELECT *
FROM mytbl AS t1
JOIN myftstbl USING (someid)         -- or ON t1.someid = myftstbl.someid
JOIN mytbl AS t2 USING (someid)      -- or ON t1.someid = t2.someid
WHERE myftstbl.{???} MATCH 'MATCHME' -- replace {???} with correct column name
  AND t1.othercol = 'somevalue'

PS。查询逻辑我不是很清楚,所以保存as-is.