2010-06-16 36 views

回答

7

只要你做的只是一个平等的(而不是像,它可以有短路的影响),只需用一个值来代替它:

EXPLAIN SELECT foo FROM bar WHERE some_column = 'foo'; 

因为它不是真正执行查询,结果应该与实际情况不同。有些情况下这是不正确的(我已经提到过LIKE)。下面是的LIKE不同的情况为例:

SELECT * FROM a WHERE a.foo LIKE ? 
  1. 参数1 == Foo - 可以使用索引扫描一个索引是否存在。
  2. 参数1 == %Foo - 需要一个完整的表扫描,即使存在索引
  3. 参数1 == Foo% - 可能使用索引扫描,这取决于索引的基数和其它因素

如果你加入,而where子句产生一个不可能的组合(因此它会短路)。例如:

SELECT * FROM a JOIN b ON a.id = b.id WHERE a.id = ? AND b.id = ? 

如果第一和第二参数是相同的,它有一个执行计划,并且如果它们是不同的,它会短路(并返回0行没有击中任何数据)...

还有其他的,但这些都是我现在能想到的我的头顶...

0

解释计划可能会有所不同,具体取决于你放入什么。我认为解释没有真实参数的计划并不意味着什么。

0

我不认为这是可能的。 WHERE some_column ='value',WHERE some_column = other_columnWHERE some_column = (SELECT .. FROM a JOIN b JOIN c ... WHERE ... ORDER BY ... LIMIT 1)返回不同的执行计划。

+3

是的,但他们也不会被允许在参数化查询;-)。所有参数都可以被替换为标量值(int,string,null等)。所以只有你的例子中的第一个将是一个适当的替代... – ircmaxell 2010-06-16 17:06:15