首页 >数据库 >mysql教程 >为什么带有子查询的 MySQL'IN”查询比显式值慢得多?

为什么带有子查询的 MySQL'IN”查询比显式值慢得多?

Barbara Streisand
Barbara Streisand原创
2024-10-31 02:09:02714浏览

 Why is a MySQL

子查询和显式值“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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn