Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询因对联接表进行参数检查而变慢_Mysql - Fatal编程技术网

MySQL查询因对联接表进行参数检查而变慢

MySQL查询因对联接表进行参数检查而变慢,mysql,Mysql,我正在编写一个存储过程,其功能是获取大量参数(由最终用户填充)并执行搜索。但是,如果参数没有值,则不应将其包含在where子句中。为此,我将检查参数作为OR子句的第一部分,如下所示: ... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2) ... 然后,我将其合并到一个通用select语句中,如下所示: SELECT * FROM table1 t1 WHERE (param1 = ''

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

... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2)  ...
然后,我将其合并到一个通用select语句中,如下所示:

SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)
请注意为了清晰起见,我在本例中只包含了一个参数。实际查询包含多个参数和字段比较

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

到目前为止还不错。然而,当引入联接表时,事情开始出错。例如,如果我执行下面的查询,则需要更长的时间(实际查询需要3-4秒):

请注意现在正在将参数与联接表(表2)中的字段进行比较

请注意在这两个示例中,在运行查询时,我已确保使用值填充param1

现在,如果删除上面WHERE子句的
param1=''或
部分,它的运行速度与上一个未联接的查询一样快

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

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


非常感谢

尝试添加第一个条件作为加入的一部分,看看这是否有帮助

SELECT *
FROM table1 t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id AND
t2.field1 = param1

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

CREATE VIEW `VW_my_simple_table_view_name` AS SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)
然后查询看起来像这样(可能需要修改)


我最终解决了这个问题,删除了表2中的
左连接
,并将其替换为一个简单的
连接
,如下所示:

SELECT *
FROM table1 t1

JOIN table2 t2
ON t1.table2Id = t2.id

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

老实说,绝对没有理由让这成为一个左派加入。我只是没在想!无论如何,非常感谢埃文和迈克尔的帮助和建议(以及他们的快速反应)。

谢谢埃文。我按照你的建议尝试了这个,但是现在当param1有一个值时,我没有得到任何结果。对不起,Evan。不幸的是,现在我无法“过滤”任何没有值的参数。为什么不呢?你是说你想要结果(null和NOTNULL,那么
where
的意义是什么?对不起,我没有弄清楚Evan。让每个参数的测试都等于“”(即无值)的意义在于,即使用户没有提供该参数的值,查询也会继续(在数据库中与其进行比较的字段将始终具有值)。换句话说,我只想返回用户提供的值,并且该值与相应字段匹配的结果。嗨,Michael。谢谢你的建议,但我不确定该方法是否有效。如果你看一下我的联接表示例,我将参数与表2中的字段进行比较。我实际上没有比较wi这是表1中的任何字段。如果我在某个地方漏掉了你的观点,我很抱歉!
SELECT *
FROM VW_my_simple_table_view_name t1

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

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

JOIN table2 t2
ON t1.table2Id = t2.id

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