【问题标题】:How do I explain a query with parameters in MySQL如何在 MySQL 中解释带参数的查询
【发布时间】:2010-06-16 16:56:19
【问题描述】:

我有一个问题

SELECT foo FROM bar WHERE some_column = ?

不填写参数值,能否从 MySQL 获取解释计划?

【问题讨论】:

    标签: mysql sql-execution-plan


    【解决方案1】:

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

    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行而不命中任何数据)...

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

    【讨论】:

      【解决方案2】:

      解释计划可能会根据您输入的内容而有所不同。我认为没有实际参数的解释计划没有任何意义。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 是的,但在参数化查询中也不允许使用它们;-)。所有可以替换的参数都是标量值(int、string、null 等)。因此,只有您示例中的第一个才是适当的替换...
        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        • 2014-06-21
        相关资源
        最近更新 更多