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

Barbara Streisand
发布: 2024-10-31 02:09:02
原创
626 人浏览过

 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!