在從另一個表中獲取資料之前,我正在嘗試使用 FULLTEXT 搜索作為初步過濾器。接下來是連續的 JOIN 以進一步細化查詢并混合匹配行(實際上,主表最多有 6 個 JOIN)。
第一個“過濾器”回傳有用的行的 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表中檢索匹配的 ID,并使用它們在主表上 JOINt1以獲得子選擇。然后我們再次將主表的副本加入為t2. 我不確定的部分是哪種方法會更快:使用匹配項中的 ID,還是使用t2?
換句話說:當我提到t1.someid第二個 JOIN 內部時,它是否只包含someid第一個 JOIN 之后的 s (所以只有那些在交集處的prior那些t1.othercol = 'somevalue)或者它是否包含someid整個原始表的所有原始 s?
您可以假設所有列都已編入索引。事實上,當我使用一種或另一種方法時,我發現 EXPLAIN QUERY PLAN 會為每個查詢使用不同的索引。所以兩者之間一定是有區別的。
uj5u.com熱心網友回復:
查詢應簡化為
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。查詢邏輯對我來說不清楚,所以按原樣保存。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481550.html
上一篇:MySQL外鍵和性能影響
下一篇:用同心“環”值構建矩陣的最快方法
