MySQL(pdo)慢子查询

时间:2016-10-11 07:51:19

标签: mysql

我有一个查询从表中获取网站访问日志。然后我再加入2个表来获取所有用户的信息。此时查询很好。

慢查询: 然后,我必须使用子查询,以便根据条件获取特定日期的访问日志。正是这个子查询导致整个查询实际上停止了。 30-40秒后查询将完成。

<小时/> 表:

  • 表格是InnoDB(更改为MyISAM对性能没有影响)。
  • Table1有接近1m的记录。表2有大约250K。表3有大约100K。表4有大约500K。

<小时/> 查询:

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函数。

1 个答案:

答案 0 :(得分:0)

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

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;