Py学习  »  DATABASE

MySQL计划和子查询与依赖子查询性能

bpeikes • 3 年前 • 1519 次点击  

我们正处于从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 取决于查询的其余部分。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128958
 
1519 次点击  
文章 [ 2 ]  |  最新文章 3 年前