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