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

Mic*_*ker 8 mysql sql-execution-plan

我有一个问题

SELECT foo FROM bar WHERE some_column = ?
Run Code Online (Sandbox Code Playgroud)

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

irc*_*ell 7

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

EXPLAIN SELECT foo FROM bar WHERE some_column = 'foo';
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM a WHERE a.foo LIKE ?
Run Code Online (Sandbox Code Playgroud)
  1. 参数1 == Foo- 如果索引存在,可以使用索引扫描.
  2. Param 1 == %Foo- 即使存在索引,也需要全表扫描
  3. 参数1 == Foo%- 可以使用索引扫描,具体取决于索引的基数和其他因素

如果您正在加入,并且where子句产生一个不可能的组合(因此它会短路).例如:

SELECT * FROM a JOIN b ON a.id = b.id WHERE a.id = ? AND b.id = ?
Run Code Online (Sandbox Code Playgroud)

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

还有其他人,但这些都是我现在想到的最重要的......