Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 在where子句中使用case语句或构造动态查询更好吗_Mysql_Sql_Stored Procedures - Fatal编程技术网

Mysql 在where子句中使用case语句或构造动态查询更好吗

Mysql 在where子句中使用case语句或构造动态查询更好吗,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我正在构造一个查询来搜索连接了数百万条记录的多个表的结果。Db是mysql 尽管我的表连接条件始终保持不变,但我的where子句语句实际上取决于用户从UI中选择的参数 案例1: WHERE table.column1 = something AND table.column2 = CASE WHEN condition1 = 0 THEN table.column ELSE condition1 END 案例2:构造一

我正在构造一个查询来搜索连接了数百万条记录的多个表的结果。Db是mysql

尽管我的表连接条件始终保持不变,但我的where子句语句实际上取决于用户从UI中选择的参数

案例1:

   WHERE table.column1 = something 
   AND
   table.column2 = CASE WHEN condition1 = 0 THEN table.column 
                          ELSE condition1 END 
案例2:构造一个动态查询,根据搜索条件附加AND条件

案例1对我来说似乎需要更多的时间。你们中有谁能建议采取哪种方法,或者有没有其他更好的方法来处理何处的动态条件


感谢您的帮助。

典型的逻辑不是用例,而是布尔逻辑:

WHERE table.column1 = something  AND
      (@condition1 = 0 OR table.column2 = @condition1)
对于all场景,可能经常使用And IS NULL而不是=0

这比动态SQL好还是坏?基本上,这是一个关于性能的问题。如果只在第1列上有索引,那么它将用于动态查询或使用布尔逻辑或大小写逻辑的查询。没关系

但是,如果您在第1列、第2列上有索引,那么上面的内容可能不会使用该索引。使用动态SQL的等效版本将使用索引,因此当您没有选择所有值时,查询的执行将更快

为此,您需要平衡编译查询。这通常需要一些时间,但不会太多。如果毫秒很重要,那么编译也很重要。如果数十秒很重要,那么很可能不是


所以,你需要平衡不同的东西。动态SQL是性能更好的选项并不罕见,特别是在存在多个条件的情况下。

在大多数情况下,最好避免使用或在where子句中使用。如果您可以在没有OR和CASE的情况下构建动态查询,那么If将运行得更快。我认为您的where条件并不像您想象的那么糟糕。它可以重写为:WHERE table.column=something和table2.column=COALESCENULLIFcondition1,0,table.column,这似乎非常合理。condition1是什么?它是由从UI生成查询的应用程序替换的文本吗?如果是这样,SQL引擎将在解析查询时评估条件,因此不会对性能产生任何影响https://stackoverflow.com/a/28909923/1491895 以一种优雅的方式在PHP中动态构建WHERE子句。您可能也可以将其应用于其他语言。