子查询和显式值“IN”查询之间的性能差距
为什么使用子查询时 MySQL“IN”查询明显慢于使用显式值时?
考虑以下查询:
<code class="sql">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')</code>
尽管子查询单独在 1 毫秒内完成,但该查询大约需要 18 秒来执行。
但是,当子查询替换为显式值时:
<code class="sql">SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid IN (24899,24900,24901,24902);</code>
查询在不到 1 毫秒内完成。
说明
性能差异是由 MySQL 评估子查询的方式引起的。每次遇到子查询都会执行,这意味着在第一个查询中,MySQL 实质上执行了 700 万个查询(对“em_link_data”表中的每一行进行子查询评估)。相反,当使用显式值时,子查询仅计算一次。
解决方法
如果无法使用 JOIN 重写查询,则可以考虑使用查询缓存以提高性能。查询缓存存储先前执行的查询的结果,并在再次执行相同的查询时重用它们。这可以显着减少子查询密集型查询的执行时间。
要启用查询缓存,请将以下行添加到 MySQL 配置文件中:
query_cache_type = 1
重新启动 MySQL 以进行更改生效。
以上是为什么带有子查询的 MySQL'IN”查询比显式值慢得多?的详细内容。更多信息请关注PHP中文网其他相关文章!