代码之家  ›  专栏  ›  技术社区  ›  Michael Barker

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

  •  8
  • Michael Barker  · 技术社区  · 16 年前

    我有一个疑问

    SELECT foo FROM bar WHERE some_column = ?
    

    我可以在不填充参数值的情况下从MySQL获得一个解释计划吗?

    3 回复  |  直到 16 年前
        1
  •  7
  •   ircmaxell    16 年前

    只要你做的只是一个相等的(而不是一个相似的,可能会有短路影响),只需用一个值来替换它:

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

    因为它实际上并没有执行查询,所以结果不应该与实际结果不同。有些情况下,这是不正确的(我已经提到像)。下面是一个不同案例的例子 LIKE :

    SELECT * FROM a WHERE a.foo LIKE ?
    
    1. PARAM 1== Foo -如果存在索引,则可以使用索引扫描。
    2. PARAM 1== %Foo -即使索引存在,也需要完整的表扫描
    3. PARAM 1== Foo% -根据索引的基数和其他因素,可以使用索引扫描

    如果您要加入,并且WHERE子句将产生一个不可能的组合(因此它将短路)。例如:

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

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

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

        2
  •  1
  •   bwawok    16 年前

    解释计划可能会有所不同,这取决于你输入的内容。我认为没有实际参数的解释计划并不意味着什么。

        3
  •  0
  •   a1ex07    16 年前

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