优化存在与不存在

Posted

技术标签:

【中文标题】优化存在与不存在【英文标题】:Optimize Exists and not exists 【发布时间】:2017-11-01 09:50:22 【问题描述】:

请帮我优化一下mysql查询

SELECT 
DISTINCT t0.ID, 
t0.CODE_MEANING, 
t0.CODE_SCHEME_DESIGNATOR, 
t0.CODE_SCHEME_VERSION, 
t0.CODE_VALUE, 
t0.MODALITY, 
t0.NAME, 
t0.OBSOLETE, 
t0.FACILITY_KEY
FROM PROTOCOL t0
WHERE EXISTS (
SELECT 1
                FROM CT_STUDY t2, STUDY t1
                WHERE t1.STUDY_DATE <= '2017-09-19 01:23:25.86'
                AND t2.ID = t1.ID
    AND t1.DTYPE = 'CTStudy'
    AND t0.ID = t2.PROTOCOL_KEY
)
AND NOT EXISTS (
SELECT 1
                FROM CT_STUDY t5, STUDY t4
                WHERE t5.PROTOCOL_KEY = t0.ID
    AND t4.STUDY_DATE > '2017-09-19 01:23:25.86'
    AND t5.ID = t4.ID
    AND t4.DTYPE = 'CTStudy'
)
AND t0.FACILITY_KEY = 1;

【问题讨论】:

您的索引呢?你能发布 EXPLAIN 的输出吗? 在解释计划下方找到 |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外的 | 1 |初级 | t0 |参考 | UK_PROTOCOL,IDX_PROTOCOL_FACILITY | UK_PROTOCOL | 4 |常量 | 1793 |使用哪里 | 3 |依赖子查询 | t5 |参考 | PRIMARY,FK_CT_STUDY_PROTOCOL,IDX_RD_CTS | FK_CT_STUDY_PROTOCOL | 9 | serphydose.t0.ID | 193 |使用索引 【参考方案1】:

Abi,请不要使用 cmets 向您的问题添加信息。请改用编辑问题按钮。您对问题编辑的信息越多,答案就越清晰。

您的数据库中似乎没有任何索引,除了数据库创建的 ID 和日期上的默认索引。

只需为查询中 WHERE 之后的所有列添加索引即可开始试验。

很抱歉,我无法确切地告诉你该怎么做,我在数据库方面做得很好,但我不是这方面的专家。在您的情况下,我所做的是尝试添加不同的索引和阅读手册。

【讨论】:

以上是关于优化存在与不存在的主要内容,如果未能解决你的问题,请参考以下文章

不存在与不存在

graphql-java-tools:空参数与不存在参数

如何在将include_tasks与不存在的目录一起使用时禁止显示警告?

Python基础(可变与不可变类型 / is和== / 特殊属性)

可变数据类型与不可变数据类型

redistemplate.delete不存在的key