我们正处于从MySql 5.7迁移到8的中期。我们有两个开发系统,大多数情况下都运行良好。我们发现问题的一个地方是,我们在生产服务器上有一个查询<2秒,但在我们的两个转换系统上,不会超过50秒。
我们在不同的计划中注意到的一点是,在我们的生产系统中
select_type
具体步骤如下:
身份证件
|
选择_类型
|
1.
|
主要的,重要的
|
2.
|
依赖子查询
|
3.
|
子查询
|
3.
|
子查询
|
3.
|
子查询
|
3.
|
子查询
|
在我们的转换数据库(8.0)中,该计划看起来像
身份证件
|
选择_类型
|
1.
|
主要的,重要的
|
2.
|
依赖子查询
|
2.
|
依赖子查询
|
2.
|
依赖子查询
|
2.
|
依赖子查询
|
2.
|
依赖子查询
|
这个
table
,
type
,
key
和
ref
列是相同的。唯一的区别似乎在于
Extra
专栏,但我不确定是什么导致了这些差异。
知道其中一些行是依赖子查询还是依赖子查询有什么影响吗?
查询的基础是:
SELECT e.ent_id, e.status_id, COUNT(e.id) AS cnt
FROM Events e
WHERE
e.ent_id IN (1)
AND
NOT EXISTS
(
SELECT eam.acct
FROM EventAccountMapping eam
WHERE
eam.event_id = e.id AND
eam.account NOT IN
(
SELECT uam.account
FROM UserAccountMapping uam
WHERE uam.user_id = 109
)
)
请注意,此部分不依赖于查询的任何其他部分:
SELECT uam.account
FROM UserAccountMapping uam
WHERE uam.user_id = 109
然而,优化器似乎将其视为一个依赖查询。此外,如果用查询结果替换该子查询,查询将在1秒内运行。即
eam.account NOT IN
(
'abc',
'def',
'ghi'
)
出于某种原因,优化器认为
UserAccountMappings
取决于查询的其余部分。