簡體   English   中英

SQL性能:哪個更快? IN()與JOIN

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM