没有IN子句

时间:2016-10-27 14:24:26

标签: mysql

我有一个由一些java代码生成的大型SQL查询。我负责修改此查询的一小部分。原始查询如下所示:

SELECT
    fields
FROM
    table1, table2, table3
WHERE
    table1.key = table2.key
AND
    table2.key2 = table3.key2
AND
    (field1 = 'x')
AND
    (field2 = 'y')

我的代码区域负责向现有查询附加额外的“AND”查询。理想情况下,其他开发人员不希望我根本调整“FROM”子句。

对于field2 ='y'部分,现在有一个新表,其中包含要检查的覆盖值。所以我最初试着写:

AND
    (field2 = 'y' OR table1.key IN (SELECT key from override_table))

当我运行上述查询时,它运行了12个多小时,必须由DBA手动终止。有趣的是,override_table完全是空的,所以我不认为它是一个索引问题。我们的数据库服务器是MySQL 5.0,我们的IT部门拒绝将其升级到更新版本(已经多次请求升级并忽略)。

我确实尝试对查询进行解释,但没有出现任何异常现象。如果我删除了'OR table1.key IN'子句,查询将立即返回运行状态。一位同事告诉我,MySQL 5在次选中挣扎。有没有什么好的方法可以重写IN子句以避免在MySQL 5中进行子选择?或者有关如何优化此查询的任何其他建议?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您只允许更改where子句,请使用:

SELECT
    fields
FROM
    table1, table2, table3
WHERE
    table1.key = table2.key
AND
    table2.key2 = table3.key2
AND
    (field1 = 'x')
AND
    (
        field2 = 'y' 
        OR exists (select 1 from override_table where key = table1.key)
    )

只需确保override_table.key已编入索引,因此table1.key也是如此。当override_table中有多个键时,EXISTS会更快。

如果您可以选择测试查询,请尝试向explain提供index hints以及exists以查看提示与不提示之间性能的差异,in +提示,Fatal error: Class 'MyApp\Chat' not found in C:\xampp\htdocs\www\chating\bin\chat-server.php on line 13 +暗示等。