当我向视图中添加连接语句时,Mysql 挂起

Posted

技术标签:

【中文标题】当我向视图中添加连接语句时,Mysql 挂起【英文标题】:Mysql hangs when i add a join statement to my View 【发布时间】:2014-11-12 23:04:42 【问题描述】:

我在 mysql 查询中添加了一个 join 语句,该查询最初在没有 join 语句的情况下工作。添加 1 个内部连接语句后,尽管没有错误,但程序需要永远输出结果。

这是原始 mysql 查询的代码:

CREATE 
VIEW `tweet_sum` AS
    select 
        `tweets`.`account_id` AS `account_id`,
        `tweets`.`user_screenname` AS `user_screenname`,
        cast(`tweets`.`time` as date) AS `period`,
        max(`tweets`.`followers_count`) AS `followers_count`,
        sum(`tweets`.`is_reply`) AS `sum_reply`,
        sum(`tweets`.`is_retweet`) AS `sum_retweet`,
        sum(`tweets`.`is_mention`) AS `sum_mention`,
        sum(`tweets`.`is_direct`) AS `sum_direct`,
        sum(`tweets`.`is_mytweet`) AS `sum_mytweet`,
        (max(`tweets`.`followers_count`) * (((((sum(`tweets`.`is_reply`) > 0) + (sum(`tweets`.`is_retweet`) > 0)) + (sum(`tweets`.`is_mention`) > 0)) + (sum(`tweets`.`is_direct`) > 0)) + (sum(`tweets`.`is_mytweet`) > 0))) AS `reach`,
        (case
            when (((((sum(`tweets`.`is_reply`) + sum(`tweets`.`is_retweet`)) + sum(`tweets`.`is_mention`)) + sum(`tweets`.`is_direct`)) + sum(`tweets`.`is_mytweet`)) > 0) then (((((sum(`tweets`.`is_reply`) + sum(`tweets`.`is_retweet`)) + sum(`tweets`.`is_mention`)) + sum(`tweets`.`is_direct`)) + sum(`tweets`.`is_mytweet`)) * max(`tweets`.`followers_count`))
            else `tweets`.`followers_count`
        end) AS `impressions`
    from
        `tweets`
    group by cast(`tweets`.`time` as date) , `tweets`.`user_screenname`;

在我添加下面的连接语句后,此代码挂起:

CREATE 
VIEW `tweet_sum_2` AS
    select 
        `tweets`.`account_id` AS `account_id`,
        `tweets`.`user_screenname` AS `user_screenname`,
        `daily_TWIT_fol`.`followers_count` AS `account_followers_count`,
        cast(`tweets`.`time` as date) AS `period`,
        max(`tweets`.`followers_count`) AS `followers_count`,
        sum(`tweets`.`is_reply`) AS `sum_reply`,
        sum(`tweets`.`is_retweet`) AS `sum_retweet`,
        sum(`tweets`.`is_mention`) AS `sum_mention`,
        sum(`tweets`.`is_direct`) AS `sum_direct`,
        sum(`tweets`.`is_mytweet`) AS `sum_mytweet`,
        (max(`tweets`.`followers_count`) * (((((sum(`tweets`.`is_reply`) > 0) + (sum(`tweets`.`is_retweet`) > 0)) + (sum(`tweets`.`is_mention`) > 0)) + (sum(`tweets`.`is_direct`) > 0)) + (sum(`tweets`.`is_mytweet`) > 0))) AS `reach`,
        (case
            when (((((sum(`tweets`.`is_reply`) + sum(`tweets`.`is_retweet`)) + sum(`tweets`.`is_mention`)) + sum(`tweets`.`is_direct`)) + sum(`tweets`.`is_mytweet`)) > 0) then (((((sum(`tweets`.`is_reply`) + sum(`tweets`.`is_retweet`)) + sum(`tweets`.`is_mention`)) + sum(`tweets`.`is_direct`)) + sum(`tweets`.`is_mytweet`)) * max(`tweets`.`followers_count`))
            else `tweets`.`followers_count`
        end) AS `impressions`
    from
        (`tweets`
        join `daily_TWIT_fol` ON ((`tweets`.`account_id` = `daily_TWIT_fol`.`account_id`)))
    group by cast(`tweets`.`time` as date) , `tweets`.`user_screenname`;

所以查询没有错误,我不知道为什么。有什么想法吗?

这是两张表的屏幕截图:

【问题讨论】:

account_id 是否在两个表中都有索引? 我做了ALTER TABLE socialdash.daily_TWIT_fol ADD INDEX (account_id) 并索引了推文; 【参考方案1】:

由于您的 account_id 在两个表中都是重复的,因此内部联接会创建大量行。假设第一个表中有 5 行 account_id=1,第二个表中有 7 行 account_id=1,内连接将单独为 account_id=1 生成 5x7=35 行。如果每个表的大小分别为 m 和 n,则连接可能会生成 mn 行。

从您的查询看起来,您似乎不仅想加入 account_id,而且还想在相同的日期加入。这应该会显着减少连接生成的行数。

【讨论】:

以上是关于当我向视图中添加连接语句时,Mysql 挂起的主要内容,如果未能解决你的问题,请参考以下文章

当我向下滚动表格视图时,隐藏单元格的复选标记消失了

优化多个 MySQL 视图的连接

当我向它添加元素时,根节点会丢失吗?

在回收站视图中滚动时,它向选定的复选框列表添加了一些其他值

当我向旅行商问题添加更多顶点时,为啥我没有得到结果?

在 Interface Builder 中添加约束时 Xcode 无限期挂起