添加像“%%”这样的 where 子句会导致性能问题吗?

Adding a where clause like '%%' cause any performance issues?

我正在编写一个查询,它将通过我的程序在数据库上执行。在该查询中,我添加了一个 where 子句,其中包含我从客户端发送的值。在某些值不存在的情况下,我将其留空(即它看起来像 select * from tablename where columname like '%%' and columname1 like '%%')。这会导致任何性能问题吗?

回答此类问题的最佳方法是通过测试。您应该在有条件和没有条件的情况下尝试查询。

where 子句添加条件至少可以通过三种方式影响性能:

  • 条件会使优化器更难为查询使用索引(或选择适当的分区)。
  • 条件可以更改 "selectivity" 的 table。如果优化器不知道被选择的行数,那么它可能会选择一个效率较低的连接和聚合算法。
  • 评估条件本身可能很昂贵。

如果您的查询很简单:

select t.*
from t
where col like '%%';

那么前两点不相关。第三个有点相关。问题是数据库是否 "optimizes" 远离了 like (因为模式是通用的)。我不这么认为;它必须用 col is not null.

替换它

使用 like 会产生一些开销。我推测 like 的开销比首先读取 table 的开销小得多。所以,虽然它可能会影响性能,但在简单的情况下,影响会比较小。