使用「IN」與明確值進行慢速MySQL 查詢
在MySQL 中,「IN」運算子在使用時可能會導致效能顯著下降通過子查詢,儘管它使用顯式值快速執行。
問題
考慮以下 MySQL 查詢:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')
儘管子查詢和列索引,此查詢執行大約需要 18 秒。然而,以顯式值取代子查詢結果可以顯著加快查詢速度,在1 毫秒內完成:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (24899,24900,24901,24902);
推理
效能差異源自子查詢的行為。在 MySQL 中,每次引用子查詢時都會對其進行評估。因此,原始查詢執行子查詢大約 700 萬次,導致效能降低。
解決方案
要解決此問題,請考慮使用JOIN 而不是子查詢:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data INNER JOIN em_link l ON em_link_data.linkid = l.id WHERE l.campaignid = '2900' AND l.link != 'open'
此方法執行單一查詢,顯著提高性能。
以上是為什麼在子查詢中使用「IN」會減慢 MySQL 查詢速度,但使用顯式值時卻不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!