同样的MySQL查询在5.6中的运行速度比在5.1中慢得多
我遇到了一个奇怪的问题,在我们将数据库从MySQL 5.1.73升级到5.6.23之后,这个特定的MySQL查询的运行速度将慢近50倍 这是SQL查询:同样的MySQL查询在5.6中的运行速度比在5.1中慢得多,mysql,sql,performance,mysql-5.6,mysql-5.1,Mysql,Sql,Performance,Mysql 5.6,Mysql 5.1,我遇到了一个奇怪的问题,在我们将数据库从MySQL 5.1.73升级到5.6.23之后,这个特定的MySQL查询的运行速度将慢近50倍 这是SQL查询: SELECT `companies`.* FROM `companies` LEFT OUTER JOIN `company_texts` ON `company_texts`.`company_id` = `companies`.`id` AND `comp
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中解释了这个查询,我看到了:
放大版:
当我在5.6.23中解释时,我看到:
放大版:
我可以看到,在这两种情况下,在所有的shows表中都有一个完整的扫描类型,但是是否有其他我没有看到的东西导致了5.6中的大规模减速
谢谢
是对不起,我看不清显示屏上的解释屏幕抓图 如果没有这些,我想知道表的模式是否发生了变化,或者数据库引擎的模式是否发生了变化。特别是companys.id似乎用作主键。请提供SHOW CREATE TABLE。如果没有这一点,我猜你错过了这个理想的指数: 显示汇总:索引设备id、包组id、视频计数 您已留下外部连接显示\u文本。。。在…上show_text.show_id不为空。这可能是错误的,原因有两个:a如果不寻找NULL,就不要使用LEFT;b NULL测试应该在missing WHERE子句中,而不是ON子句中 正在清除选择中的。。。可能在两台机器上都有帮助:
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;
连接有可能会干扰Sumsrc.view\u count中的计算。我看不懂这些解释计划-你能将它们粘贴成等距文本吗?请在http:bugs.mysql.com上写一份错误报告;他们想知道新优化器的性能比旧优化器差的情况。根据我所知,第二个解释计划看起来比第一个好。此外,还可以通过分析获取其他有用信息:。这两台服务器上的硬件完全相同吗?对不起,图片看起来很小,但是如果你转到这里的直接URL,它们会更清晰:5.1:5.6:对不起,图片看起来很小,但是如果你转到这里的直接URL,它们会更清晰:5.1:i.stack.imgur.com/c4ko0.jpg 5.6:i.stack.imgur.com/CgBtA.jpgHi,谢谢你的回复。关于SHOW CREATE TABLE,如果我在SHOW_汇总中检查,这些列SHOW_id、package_group_id和device_id上有一个唯一的索引,而不是device_id、package_group_id和videos_count。还有id列的主键,没有其他索引Hanks Rick James,我在您的SQL中做了一个小小的修改,它工作得又快又好!