mysql - 资源密集型 MySQL 嵌套选择

标签 mysql

我有一个非常简单的嵌套查询,调用它时需要 90% 以上的 CPU,我似乎无法弄清楚原因。

SELECT * FROM `push_log` 
WHERE push_id IN 
(SELECT `push_id` FROM push_sent_log 
    WHERE player_id='".$player_id."' 
        OR push_group='All' 
        AND `timestamp` >= DATE_SUB(CURDATE(), INTERVAL 24 hour) ) 
    ORDER BY timestamp DESC"

所有查询的字段都有索引。有没有更有效的方法来做到这一点?

最佳答案

尝试删除子查询而不是 join:

SELECT p.*
      FROM push_sent_log ps
      JOIN `push_log` p ON p.push_id= ps.push_id
    WHERE ps.player_id='".$player_id."' 
        OR ps.push_group='All' 
        AND `ps.timestamp` >= DATE_SUB(CURDATE(), INTERVAL 24 hour) ) 
    ORDER BY p.timestamp DESC"

我还认为你需要检查你的 sql 中的 where,这似乎没有意义,因为它们处于同一级别:

 WHERE ps.player_id='".$player_id."' 
            OR ps.push_group='All' 
            AND `ps.timestamp` >= DATE_SUB(CURDATE(), INTERVAL 24 hour)  -- why do you using OR and AND at the same time? 

关于mysql - 资源密集型 MySQL 嵌套选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49924320/

相关文章:

php - 在 "IN CLAUSE"mysql php 中返回 null 或空字符串

php 警告 - 为 foreach() 提供的参数无效

mysql - 在内连接中传递第二个表中的所有值

mysql - 如何通过对同一个表的两个引用来防止内部连接上的名称不明确

java 从数组中插入/更新表中的单个列

mysql - 如果有敏感信息,我应该在 MySQL 上加密什么?

php - 单个帖子的多个类别

mysql - 当 MySQL 中有多个匹配项时更新 XML 节点

mysql - 在 Mysql 中获取具有以空格和一个字符结尾的字段的行

mysql - 数据不会使用插入和右连接插入到表中