2012-06-29 63 views
0

我有以下存儲過程:如何重寫查詢以避免記錄作爲log_queries_not_using_indexes

CREATE PROCEDURE testProc(IN p_idProject INTEGER) 
BEGIN 
DECLARE nowTime DATETIME; 
SET @nowTime = NOW(); 

    SELECT 
     idCustomer 
    FROM NextCalls WHERE @nowTime-nextCall = 
     (SELECT MAX(@nowTime - nextCall) 
      FROM NextCalls 
      WHERE idProject = p_idProject AND nextCall < @nowTime) 
    LIMIT 1; 
END $$ 

有指數nextCall列設置。不幸的是,它正在被登錄到mysql-slow.log文件作爲查詢,沒有正確使用索引。此過程非常經常使用,我很樂意避免錯誤的索引。是否可以重寫來實現這一點?

回答

0

您只是選擇最古老的nextCall。有沒有必要進行任何計算,你可以只使用ORDER BY

SELECT idCustomer 
FROM NextCalls 
WHERE idProject = p_idProject AND nextCall < CURRENT_TIMESTAMP 
ORDER BY nextCall 
LIMIT 1 
+0

我得失明 - 如此明顯的解決方案:) Thx。順便說一句 - 您在'CURRENT_TIMESTAMP'中忘記了'E' – Joe

+0

更正了current_timestamp。尋找最簡單的解決方案通常並不容易。 :) – Matijs