這是一個我從未得到確切答案的問題。我在這個例子中使用MySQL。SQL性能:哪個更快? IN()與JOIN
給定一組相當大的值(可以說500)。它是更快地使用這些值與在尋找一個表()子句:
SELECT * FROM table WHERE field IN(values)
或者通過在內存中創建一個臨時表,用值填充,並將其加入到表被搜索:
CREATE TEMPORARY TABLE `temp_table` (`field` varchar(255) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO temp_table VALUES (values)
SELECT * FROM table t1 JOIN temp_table t2 ON t1.field = t2.field
兩種方法都會產生相同的結果集。
我已經完成了一些我自己的基本基準測試,發現處理超過500個值時,使用臨時表比IN()子句更快。
有人可以向我解釋MySQL的內部工作原理以及這個問題的正確答案是什麼?
感謝, 利奧
請發佈您的基準,以便對它們進行驗證。你有領域的索引嗎? –
你知道答案很大程度上取決於數據庫的結構嗎?創建臨時表,填充它並加入表涉及大量的CPU工作,與使用帶有IN運算符的查詢相反。由於內存存儲IO會更快,但是InnoDB也可以將其工作數據集保存在內存中。如果你根據InnoDB表的主鍵進行'IN'搜索 - 它會勝過臨時表。 –
如果你也發佈瞭解釋計劃,這將會很有趣。 –