0

我正在编写一个存储过程,其功能是获取一些参数(由最终用户填充)并执行搜索。但是,如果参数没有值,则不应将其包含在 WHERE 子句中。为此,我将参数作为 OR 子句的第一部分进行检查,如下所示:

... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2)  ...

然后我将其合并到一个一般的选择语句中,如下所示:

SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)

请注意,为清楚起见,我在此示例中仅包含了一个参数。真正的查询包含多个参数和字段比较。

这工作正常并且运行迅速(例如,“真实”查询在大约 0.5 秒内返回结果)。

到现在为止还挺好。然而,当引入一个连接表时,事情就开始出错了。例如,如果我执行下面的查询,则需要更长的时间(实际查询需要 3-4 秒):

SELECT *
FROM table1 t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id

WHERE (param1 = '' OR t2.field1 = param1)

请注意,该参数现在正在与连接表 (table2) 中的字段进行比较。

请注意,在这两个示例中,在运行查询时,我确保 param1 填充了一个值。

现在,如果我删除param1 = '' OR上述 WHERE 子句的部分,它的运行速度与之前的未连接查询一样快。

尽管我已经尝试过,但我的表中使用的所有字段目前都没有被索引,这对我遇到的问题没有任何影响。

那么,谁能向我解释为什么第一个查询(单个表)工作得很快,但第二个查询(连接表)花费的时间不成比例?

提前谢谢了。

4

3 回答 3

0

尝试将第一个条件添加为 the 的一部分,JOIN看看是否对您有帮助。

SELECT *
FROM table1 t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id AND
t2.field1 = param1
于 2013-04-05T11:50:42.667 回答
0

您可以尝试创建一个视图,并在您的联接语句中使用该视图的结果。

CREATE VIEW `VW_my_simple_table_view_name` AS SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)

然后查询看起来像这样(可能需要调整)

SELECT *
FROM VW_my_simple_table_view_name t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id

WHERE (t2.field1 = param1)
于 2013-04-05T11:54:08.567 回答
0

我终于通过删除LEFT JOINon table2 并用下面的简单替换它来解决这个问题JOIN

SELECT *
FROM table1 t1

JOIN table2 t2
ON t1.table2Id = t2.id

WHERE (param1 = '' OR t2.field1 = param1)

老实说,绝对没有理由将其设为 LEFT JOIN。我只是没想到!无论如何,非常感谢 Evan 和 Michael 的帮助和建议(以及他们超快速的反应)。

于 2013-04-05T14:40:16.370 回答