注意:原始問題沒有實際意義,但掃描到底部以獲取相關內容。如何優化MySQL的常量查詢?
我有一個查詢我想優化,看起來是這樣的:
select cols from tbl where col = "some run time value" limit 1;
我想知道正在使用哪些密鑰,但無論我傳遞給解釋一下,它能夠優化where子句(「不可能在哪裏注意到...」),因爲我給它一個常量。
- 有沒有辦法告訴mysql不要在解釋中做不斷的優化?
- 我錯過了什麼嗎?
- 有沒有更好的方式來獲取我需要的信息?
編輯:EXPLAIN
似乎給我的查詢計劃,將產生於常數值。由於查詢是存儲過程的一部分(並且在被調用之前生成了spoc中的IIRC查詢計劃),這對我沒有好處,因爲該值不是恆定的。我想要的是找出當優化器不知道實際值是什麼時將生成的查詢計劃。
我錯過了嗎?
Edit2:在其他地方問一下,似乎MySQL總是重新生成查詢計劃,除非你不想讓它重新使用它們。即使在存儲過程中。從這看來,我的問題似乎沒有實際意義。
但是,這並不使我真正想知道的實際意義:如何優化包含任何特定的查詢中是恆定的,但在那裏我,程序員,事先不知道值查詢什麼價值將被使用? - 例如,假設我的客戶端代碼正在使用where
子句中的數字生成查詢。在某些情況下,該號碼將導致不可能在其他時間條款不會。我如何使用解釋來檢查查詢的優化程度?
我現在看到的最好的方法就是運行EXPLAIN
上的存在/不存在案例的完整矩陣。真的,這不是一個很好的解決方案,因爲這很難,也很容易出錯。
那些幽冥解決了我的問題。我想知道查詢計劃是優化器*不知道的地方*如果值在列中。 – BCS 2008-11-23 03:01:28
下面是它的工作原理:優化器通過讀取const和系統表來確定選擇是否可能,如果是,則獲取查詢計劃。我的解決方案將爲您提供查詢計劃,因爲優化程序不會提前停止,因爲它認爲查詢是不可能的。 – 2008-11-23 03:28:24
是的,它會給你一個查詢計劃並避免where子句永不傳遞的問題,但是它會假設where子句將總是*傳遞,而且也不是這種情況。我想要的是知道事情將如何執行這兩種情況。 (見編輯2) – BCS 2008-11-23 21:19:28