当我向视图中添加连接语句时,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 挂起的主要内容,如果未能解决你的问题,请参考以下文章