[英]SQL performance: Which is quicker? IN() versus JOIN
這是一個我從來沒有得到明確答案的問題。 我在這個例子中使用MySQL。
給定一組相當大的值(比方說500)。 使用IN()子句使用這些值搜索表是否更快:
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的內部工作原理以及這個問題的正確答案是什么?
謝謝,獅子座
從MySql在線文檔, IN() :
IN(值,......)
如果所有值都是常量 ,則根據expr的類型對其進行求值並進行排序。 然后使用二分搜索完成對項目的搜索。 這意味着如果IN值列表完全由常量組成,則IN非常快。 否則,類型轉換將根據第11.2節“表達式評估中的類型轉換”中所述的規則進行,但應用於所有參數。
考慮到我認為將IN()與一組常量一起使用是有意義的,否則你應該在另一個表上使用子查詢。
當從其他表中檢索項時,您可以考慮使用EXISTS()而不是JOIN,對於大型數據集,它會明顯更快
SELECT *
FROM table t1
WHERE EXISTS
(
SELECT *
FROM temp_table t2
WHERE t1.field = t2.field
)
正確的答案取決於很多事情。
你已經完成了工作 - 如果你的基准測試告訴你使用臨時表更快,那么這就是你要走的路。
如果更改硬件或顯着改變架構,請記住再次進行基准測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.