2016-05-15 54 views
0

我想看看SQL的执行计划:MySQL不能显示解释数据

explain select name,address from address where id=? 

但它说:

您的SQL语法错误;检查手册, 对应于您的MySQL服务器版本的正确语法使用 附近'?'

  1. 不使用时解释计划,而不是绑定变量的MySQL只支持指定SQL值?
  2. 如果不是,我怎么看到绑定变量的执行计划?因为我认为执行计划的选择*从地址在哪里id =?是不同的选择*从地址id = 2。
  3. 另外,当我在mysql中使用说明时,它不会显示这个sql会像Oracle那样是全表访问或索引访问等,所以我怎么能看到这些信息?

回答

2

你无法看到使用?占位符的查询计划,因为查询计划优化器均基于所提供的特定值执行查询时创建的。

我认为执行计划的选择*从地址在哪里id =?是不同的select *从地址id = 2

如果“2”是绑定值,计划将是相同的。没有默认计划,没有具体的价值。它是在每次调用准备好的语句时创建的,因为根据索引潜水的结果,不同的值可能需要不同的计划。

此外,当我在MySQL中使用说明,它不显示SQL语句将被全表访问或索引访问ECT

是的,它的作用。不是叙述形式,而是信息在那里解释。请参阅文档中的EXPLAIN Output Format

简而言之:如果typeALL(全表扫描)或index(完整索引扫描),则您的查询正在进行全面扫描;另一方面,如果typerefeq_refrange(和一些其他较不常见的值),则key列指示用于相等或范围查找的索引。

请注意,常见的新手错误是错误地解释了Extra列中的Using index的含义。当存在这个指示符时,意味着查询所需的所有列都存在于单个索引中,并且优化器将使用该索引作为覆盖索引来读取查询的数据,而不是从表数据本身读取 - 这个标志不会与索引查找混淆。

+0

感谢您的回答,我误解了Oracle和MySql的执行计划,因为Oracle的执行计划可能有?在SQL中。同时,我看到你对解释输出格式的参考,似乎没有'成本','时间','CPU成本'等信息,像甲骨文这样我们可以用数字来知道或比较执行计划? – frank

+0

还有其他信息,包括成本估算值,可以使用[优化器跟踪](https://dev.mysql.com/doc/internals/en/optimizer-tracing.html)找到,但这些细节应该是不必要的,除非您正试图理解优化器如何选择它所做的计划。我无法解决Oracle问题。 –