gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:40:09 26 4
gpt4 key购买 nike

我遇到一个奇怪的问题,在我们将数据库从 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 `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 中对此查询做了解释,我看到了这个:

EXPLAIN with MySQL 5.1.73放大版:http://i.stack.imgur.com/c4ko0.jpg

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

EXPLAIN with MySQL 5.6.23放大版:http://i.stack.imgur.com/CgBtA.jpg

我可以看到,在这两种情况下,都会对显示表进行完整扫描(键入 ALL),但是还有其他我没有看到的东西导致 5.6 中的速度大幅下降吗?

谢谢是

最佳答案

请提供显示创建表。如果没有这个,我猜你会错过这个理想的索引:

show_rollups:INDEX(device_id、package_group_id、videos_count)

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

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

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;

JOIN 有可能会扰乱 Sum(src.view_count) 中的计算。

关于mysql - 相同的 MySQL 查询在 5.6 中的运行速度比在 5.1 中慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com