首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL慢子查询

问MySQL慢子查询
EN

Stack Overflow用户
提问于 2016-10-11 07:51:19
回答 1查看 62关注 0票数 0

我有一个查询,从一个表中获取网站访问日志。然后,我加入了另外两个表,以便获取用户的所有信息。此时,查询就可以了。

慢速查询:然后,我必须使用一个子查询,以便根据条件获得某个日期的访问日志。正是这个子查询导致整个查询几乎停止。30-40秒后,查询将完成。

表:

​

  • 表是InnoDB (更改为MyISAM对性能没有影响)。
  • Table1有近100万条记录。Table2大约有250 K。Table3大约有100 K。Table4大约有500 K。

​

查询:

​

代码语言:javascript
复制
SELECT COUNT(*) AS visits , table1.userName, table2.userId, table2.col1, table2.col2, table2.col3, table2.col4, table3.col20
    FROM table1
    LEFT JOIN table2 ON table2.userName = table1.userName
    LEFT JOIN table3 ON table3.col2 = table1.col2
    WHERE table1.col1 = 'foo'
    AND table1.Date > (
        SELECT max(a.VisitDate) FROM table4 a
            WHERE  a.userId = table2.userId AND a.col1 = 'bar'
        )
    GROUP BY table1.userName, table1.Date

我没有构建这个数据结构,也没有选择去改变它。我将此查询解析为一个基本的PDO函数。

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 07:56:43

您可以尝试使用内部连接(在子选择上)

代码语言:javascript
复制
SELECT 
      COUNT(*) AS visits 
    , table1.userName
    , table2.userId
    , table2.col1
    , table2.col2
    , table2.col3
    , table2.col4
    , table3.col20
FROM table1
LEFT JOIN table2 ON table2.userName = table1.userName
LEFT JOIN table3 ON table3.col2 = table1.col2
INNER JOIN (
    SELECT max(a.VisitDate) as max_visit_date FROM table4 a
        WHERE  a.userId = table2.userId AND a.col1 = 'bar'
    )  t  on table1.Date > t.max_visit_date
GROUP BY table1.userName, table1.Date;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39972658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档