【问题标题】:MySQL Poor Performance with Not Exists QueryMySQL 性能不佳,查询不存在
【发布时间】:2014-06-04 19:15:46
【问题描述】:

我现在有一个生产中的应用程序进行 MySQL 查询以选择一个表中没有另一个表中的关联行的列 为此,我目前正在使用一个 MySQL 存在查询,该查询似乎变得更慢并且添加的结果越多,速度越慢。

这是当前查询的示例:

SELECT m.ig_media_id, m.media_promotion_id FROM media_promotions m
WHERE m.likes_received < m.likes_requested 
AND m.user_id != 19 
AND m.active = 1
AND NOT EXISTS 
    (SELECT * from media_actions m_a WHERE m_a.user_id = 19 AND m_a.ig_media_id = m.ig_media_id)
ORDER BY m.created_at ASC
LIMIT 1

我能做些什么来加快这个速度?它目前以大约 3 秒的速度运行,并且确实减慢了我的应用程序。

【问题讨论】:

  • SELECT * 通常是一个坏主意(对于 Mysql 中的 (NOT) EXISTS 子查询,它不计算在内),那么也许在不必要的时候使用子查询是另一个。
  • 发布EXPLAIN SELECT ... 的输出会有帮助。
  • @JoshuaMartell 为什么 NOT EXISTS SELECT 语句表是什么很重要?我只是不希望它满足 WHERE 要求。而且,当我在该 select 语句中选择单个列时,查询会变得更慢。

标签: php mysql performance join exists


【解决方案1】:

这是子查询:

NOT EXISTS (SELECT *
            from media_actions m_a
            WHERE m.user_id = 19 AND m_a.ig_media_id = m.ig_media_id
           )

您可以通过索引加快速度:

create index idx_media_actions on media_actions(ig_media_id, user_id)

你也可以这样表述:

NOT EXISTS (SELECT 1
            from media_actions m_a
            WHERE m.user_id = 19 AND m_a.ig_media_id = m.ig_media_id
           )

不过,我认为 MySQL 足够聪明,可以在这样的子查询中忽略 *

【讨论】:

  • Gordon,在这些列上创建索引让世界变得与众不同!
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 2012-08-23
  • 2023-03-23
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多