如何在MySQL中解释带参数的查询

时间:2010-06-16 16:56:19

标签: mysql sql-execution-plan

我有一个查询

SELECT foo FROM bar WHERE some_column = ?

我可以从MySQL获得解释计划而不填写参数值吗?

3 个答案:

答案 0 :(得分:7)

只要您只做一个等于(而不是类似,可能会产生短路影响),只需将其替换为值:

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

由于它实际上并没有执行查询,因此结果不应与实际结果不同。在某些情况下,这是不正确的(我已经提到过LIKE)。以下是LIKE

的不同情况的示例
SELECT * FROM a WHERE a.foo LIKE ?
  1. Param 1 == Foo - 如果索引存在,可以使用索引扫描。
  2. Param 1 == %Foo - 即使存在索引,也需要全表扫描
  3. Param 1 == Foo% - 可以使用索引扫描,具体取决于索引的基数和其他因素
  4. 如果您正在加入,并且where子句产生一个不可能的组合(因此它会短路)。例如:

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

    如果第一个和第二个参数相同,则它有一个执行计划,如果它们不同,它将短路(并返回0行而不点击任何数据)......

    还有其他人,但是现在我能想到的就是这些......

答案 1 :(得分:1)

解释计划可能因你投入的内容而有所不同。我认为没有真实参数的解释计划并不意味着什么。

答案 2 :(得分:0)

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