2016-05-15 56 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問題。 –