【发布时间】:2012-01-04 18:12:40
【问题描述】:
我有以下 SQL 查询:
SELECT DISTINCT business_key
FROM Memory
WHERE concept <> 'case' OR attrib <> 'status' OR value <> 'closed'
我试图实现的是获取所有没有记录的唯一业务密钥 concept=case AND attrib=status AND value=closed。在 MySQL 中使用 500 000 条记录和所有唯一业务键运行此查询非常慢:大约 11 秒。
我为business_key 列、concept、attrib 和value 列放置了索引。我还尝试了对所有三列(概念、属性、值)的组合索引,但结果是一样的。
这是EXPLAIN EXTENDED命令的截图:
有趣的是,在没有 distinct 说明符的情况下运行查询会导致执行速度非常快。
我也试过这个:
SELECT DISTINCT m.business_key
FROM Memory m
WHERE m.business_key NOT IN
(SELECT c.business_Key
FROM Memory c
WHERE c.concept = 'case' AND c.attrib = 'status' AND c.value = 'closed')
结果更糟:大约 25 秒
【问题讨论】:
-
您是否尝试过将 OR 更改为 AND,如果这是您想要摆脱的?它可能很慢的原因是,在后台,它将查询转换为 3 个查询(OR 各一个),然后过滤掉唯一的。
-
@Neville K:我想要实现的是获取不具有等于概念=case、attrib=status 和 value=close 行的业务键。因此,我不能简单地使用 AND。请查看更新。
-
此查询返回 500K 行中有多少行?
-
@ypercube:全部。所有业务密钥都是唯一的。
-
@MartinDimitrov 但你还没有回答这个问题。查询返回多少行?
标签: mysql sql performance sql-optimization sqlperformance