mysql - 在where子句中使用case语句更好还是构建动态查询更好

标签 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:构造一个动态查询,根据搜索条件附加 AND 条件。

案例 1 看起来需要更多时间。你们中的任何人都可以建议采取哪一种方法,或者是否有其他更好的方法来应对本地的动态条件。

感谢您的帮助。

最佳答案

典型的逻辑不使用case,只是 bool 逻辑:

WHERE table.column1 = something  AND
      (@condition1 = 0 OR table.column2 = @condition1)

(对于“全部”场景,可能经常使用 IS NULL 代替 = 0。)

这比动态 SQL 好还是坏?基本上,这是一个关于性能的问题。如果您仅在 (column1) 上有索引,那么它将用于动态查询或使用 bool (或 case)逻辑的查询。没关系。

但是,如果您在(column1,column2)上有索引,那么上面的代码可能不会使用该索引。使用动态 SQL 的等效版本使用索引,因此当您不选择所有值时,查询的执行会更快。

针对这一点,您需要平衡编译查询。这通常需要一些时间,但不会太多。如果毫秒很重要,那么编译就很重要。如果几十秒很重要,那么可能不会。

因此,您需要平衡不同的事情。动态 SQL 成为性能更好的选项并不罕见,特别是在存在多个条件时。

关于mysql - 在where子句中使用case语句更好还是构建动态查询更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085978/

相关文章:

php - mysqli 执行生成错误查询

mysql - 在已连接的表上连接表

sql - 存储过程的模式?

mysql - 获取已注册所有 adv 的 id

tsql - 创建可以处理不同表的存储过程

postgresql - 您将如何在存储过程中读取 csv 以便 csv 需要数据提取?

sql - select * 是否影响存储过程性能?

mysql - 如何在 MySQL 和 Parse.com 之间交换数据?

php - 显示百分比结果

SQL Where IN 与 CASE