【发布时间】:2010-06-16 16:56:19
【问题描述】:
我有一个问题
SELECT foo FROM bar WHERE some_column = ?
不填写参数值,能否从 MySQL 获取解释计划?
【问题讨论】:
我有一个问题
SELECT foo FROM bar WHERE some_column = ?
不填写参数值,能否从 MySQL 获取解释计划?
【问题讨论】:
只要你只做一个等于(而不是一个可能有短路影响的类似),只需用一个值替换它:
EXPLAIN SELECT foo FROM bar WHERE some_column = 'foo';
由于它实际上并未执行查询,因此结果不应与实际不同。在某些情况下这是不正确的(我已经提到过 LIKE)。下面是LIKE不同情况的例子:
SELECT * FROM a WHERE a.foo LIKE ?
Foo - 如果存在索引,则可以使用索引扫描。%Foo - 需要全表扫描,即使存在索引也是如此Foo% - 可能使用索引扫描,具体取决于索引的基数和其他因素如果您要加入,并且 where 子句产生了一个不可能的组合(因此它会短路)。例如:
SELECT * FROM a JOIN b ON a.id = b.id WHERE a.id = ? AND b.id = ?
如果第一个参数和第二个参数相同,它有一个执行计划,如果它们不同,它会短路(并且返回0行而不命中任何数据)...
还有其他的,但我现在能想到的就这些了……
【讨论】:
解释计划可能会根据您输入的内容而有所不同。我认为没有实际参数的解释计划没有任何意义。
【讨论】:
我认为这是不可能的。
WHERE some_column ='value'、WHERE some_column = other_column 和 WHERE some_column = (SELECT .. FROM a JOIN b JOIN c ... WHERE ... ORDER BY ... LIMIT 1 ) 返回不同的执行计划。
【讨论】: