首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同的MySQL查询在5.6中运行速度比5.1中慢得多

相同的MySQL查询在5.6中运行速度比5.1中慢得多
EN

Stack Overflow用户
提问于 2015-04-02 00:24:20
回答 2查看 664关注 0票数 0

我遇到了一个奇怪的问题,在我们将数据库从MySQL 5.1.73升级到5.6.23之后,这个特定的MySQL查询运行速度会慢近50倍。

这是SQL查询:

代码语言:javascript
复制
SELECT `companies`.*
FROM   `companies` 
   LEFT OUTER JOIN `company_texts` 
                ON `company_texts`.`company_id` = `companies`.`id` 
                   AND `company_texts`.`language` = 'en' 
                   AND `company_texts`.`region` = 'US' 
   INNER JOIN show_texts 
           ON show_texts.company_id = companies.id 
              AND `show_texts`.`is_deleted` = 0 
              AND `show_texts`.`language` = 'en' 
              AND `show_texts`.`region` = 'US' 
   INNER JOIN show_region_counts 
           ON show_region_counts.show_id = show_texts.show_id 
              AND show_region_counts.region = 'US' 
    WHERE  ( ( `companies`.`id` NOT IN ( '77', '26' ) ) 
     AND ( `company_texts`.is_deleted = 0 ) 
     AND `companies`.id IN (
        SELECT DISTINCT show_texts.company_id AS 
                                id 
                FROM   shows 
                       INNER JOIN `show_rollups` 
                               ON 
                                `show_rollups`.`show_id` = `shows`.`id` 
                                    AND ( `show_rollups`.`device_id` = 3 ) 
                                    AND ( `show_rollups`.`package_group_id` = 2 ) 
                                    AND ( `show_rollups`.`videos_count` > 0 ) 
                                LEFT OUTER JOIN `show_texts` ON 
                                    `show_texts`.`show_id` = `shows`.`id` 
                                        AND 
                                    `show_texts`.`is_deleted` = 0 
                                       AND 
                                    `show_texts`.`language` = 'en' 
                                       AND 
                                    `show_texts`.`region` = 'US'
                                       AND
                                    shows.is_browseable = 1 
                                    AND 
                                    show_texts.show_id IS NOT NULL 
                                    AND ( 
                                        `show_rollups`.`episodes_count` > 0 
                                        OR `show_rollups`.`clips_count` > 0 
                                        OR `show_rollups`.`games_count` > 0 
                                        )   


     ) ) 
    GROUP  BY companies.id 
    ORDER  BY Sum(show_region_counts.view_count) DESC 
    LIMIT  30 offset 30; 

现在的问题是,在升级之前在MySQL 5.1.73中运行此查询时,查询只需大约1.5秒,但是在升级到5.6.23之后,它现在可能需要超过1分钟。

因此,我在5.1.73中对这个查询做了解释,我看到了以下内容:

放大版:http://i.stack.imgur.com/c4ko0.jpg

当我在5.6.23中解释的时候,我看到了这个:

放大版:http://i.stack.imgur.com/CgBtA.jpg

我可以看到,在这两种情况下,都有一个完整的扫描(键入所有)显示表,但还有什么东西,我没有看到,是造成了5.6的大规模放缓?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-02 01:30:31

请提供SHOW CREATE TABLE。如果没有这一点,我猜您缺少了这个理想的索引:

show_rollups:索引(device_id,package_group_id,videos_count)

你有LEFT OUTER JOIN show_texts ... ON ... show_texts.show_id IS NOT NULL。这可能是错误的两个原因:(a)如果不寻找LEFT,则不要使用NULL;(b) NULL测试应该在缺少的WHERE子句中,而不是在ON子句中。

摆脱IN ( SELECT ... )可能对这两台机器都有帮助:

代码语言:javascript
复制
SELECT  c.*
    FROM  
      ( SELECT  DISTINCT st.company_id AS id
            FROM  shows
            INNER JOIN  `show_rollups` AS sr ON sr.`show_id` = `shows`.`id`
              AND  ( sr.`device_id` = 3 )
              AND  ( sr.`package_group_id` = 2 )
              AND  ( sr.`videos_count` > 0 )
            LEFT OUTER JOIN  `show_texts` AS st ON st.`show_id` = `shows`.`id`
              AND  st.`is_deleted` = 0
              AND  st.`language` = 'en'
              AND  st.`region` = 'US'
              AND  shows.is_browseable = 1
              AND  st.show_id IS NOT NULL
              AND  ( sr.`episodes_count` > 0
                      OR  sr.`clips_count` > 0
                      OR  sr.`games_count` > 0 ) 
      ) AS x
    JOIN  `companies` AS c ON x.id = c.id
    LEFT OUTER JOIN  `company_texts` AS ct ON ct.`company_id` = c.`id`
          AND  ct.`language` = 'en'
          AND  ct.`region` = 'US'
    INNER JOIN  show_texts AS st ON st.company_id = c.id
          AND  st.`is_deleted` = 0
          AND  st.`language` = 'en'
          AND  st.`region` = 'US'
    INNER JOIN  show_region_counts AS src ON src.show_id = st.show_id
          AND  src.region = 'US'
    WHERE  ( c.`id` NOT IN ( '77', '26' ) )
      AND  ( ct.is_deleted = 0 )
    GROUP BY  c.id
    ORDER BY  Sum(src.view_count) DESC
    LIMIT  30 offset 30; 

Sum(src.view_count)中,联接有可能会扰乱计算。

票数 0
EN

Stack Overflow用户

发布于 2015-04-02 00:35:43

对不起,我看不出我显示器上的解释屏幕抓取。

如果没有这一点,我想知道表的模式是完全改变了,还是数据库引擎的模式发生了变化。特别是,companies.id似乎被用作主键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29403112

复制
相关文章

相似问题

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