mysql - 查询优化。没有 NOT IN 的查询

标签 mysql subquery query-optimization

我有一张包含 ID 和代码条目的表格。代码是唯一的,但 id 是主键。

ID Code 
1 ABC1234T
2 ABC6789Y
3 ABC9999A
4 QAZ1234G
5 QAZ6574U
6 QAZ9999A
7 TRE1234Y
8 REW1234U

我需要找到没有 *999A 条目的前缀(前 3 个字母)。在给定的示例中,它将是 TRE 和 REW。我的查询很慢,在 ~9000 条记录上运行需要 17 秒。我知道这主要是因为我使用的是 NOT IN 和子查询。谁能给我一些如何优化它的想法?

SELECT distinct LEFT(newcode, 3) as codeprefix FROM diatcode where (LEFT(newcode, 3)) NOT in (select DISTINCT LEFT(newcode, 3) from diatcode where newcode like '___9999A' ) order by newcode

最佳答案

您可以进行左连接,然后根据空值进行过滤。它避免了子查询,但我不确定这是最快的解决方案。

SELECT DISTINCT LEFT(d1.newcode, 3) as codeprefix
FROM diatcode d1
LEFT JOIN (SELECT DISTINCT LEFT(d2.newcode, 3) as codeprefix
  FROM diatcode d2
  WHERE d2.newcode LIKE '___9999A') t2
ON LEFT(d1.newcode, 3)=t2.codeprefix
WHERE t2.codeprefix IS NULL;

关于mysql - 查询优化。没有 NOT IN 的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446369/

相关文章:

mysql - 如何在 where 子句中使用临时列

sql - 如何避免对 IN 子句重复此子查询?

objective-c - NSPredicate 与 AND 在一对多关系中

sql - ON 子句中的列是否需要索引?

mysql - 优化mysql对重复记录表的update语句

java - 使用java在Xampp中mysql和apache服务的状态(运行/未运行)

python - 创建触发器 sys_exec 和 python

php - 在 android 中访问服务器文件的本地主机路径是什么?

grails - 使用 detachedCriteria 作为 in 子句的子查询

mysql - 优化大表中的 SELECT