我有一个查询
SELECT foo FROM bar WHERE some_column = ?
我可以从MySQL获得解释计划而不填写参数值吗?
答案 0 :(得分:7)
只要您只做一个等于(而不是类似,可能会产生短路影响),只需将其替换为值:
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行而不点击任何数据)......
还有其他人,但是现在我能想到的就是这些......
答案 1 :(得分:1)
解释计划可能因你投入的内容而有所不同。我认为没有真实参数的解释计划并不意味着什么。
答案 2 :(得分: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 )
会返回不同的执行计划。