sql - 子查询与连接

标签 sql mysql performance database-design join

我重构了我们从另一家公司继承的应用程序的慢速部分,以使用内部联接而不是子查询,例如:

WHERE id IN (SELECT id FROM ...)

重构后的查询运行速度提高了大约 100 倍。(约 50 秒到约 0.3 秒)我预计会有改进,但谁能解释为什么它如此激烈? where 子句中使用的列都已编入索引。 SQL 是否每行执行一次 where 子句中的查询?

更新 - 解释结果:

区别在于“where id in ()”查询的第二部分——

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

vs 1 个带有连接的索引行:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

最佳答案

“相关子查询”(即,其中 where 条件取决于从包含查询的行获得的值)将为每一行执行一次。一个不相关的子查询(其中 where 条件独立于包含的查询)将在开始时执行一次。 SQL 引擎会自动进行这种区分。

但是,是的,解释计划会给你一些肮脏的细节。

关于sql - 子查询与连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/141278/

相关文章:

sql - 如何在PostgreSQL中使用date_trunc截断到100毫秒?

mysql - php mysql 查询选择

python - 随着时间的推移,Django 查询变得越来越慢

c++ - unordered_map : which one is faster find() or count()?

sql - 获取3名或3名以上来自同城的员工列表?

mysql - 按天对 Unix 时间戳进行分组,产生不均匀间隔的组

sql - 我可以在计算列上创建索引吗?

mysql - 如何在 rsyslog 中仅插入来自常规日志的 mac 地址?

mysql从多选中选择最低价格

performance - cassandra 数据库 - 获取大量数据