我有一个由一些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中进行子选择?或者有关如何优化此查询的任何其他建议?
感谢。
答案 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
+暗示等。