2017-06-26 78 views
0

是否有可能提高此sql語句的速度?提高子查詢sql語句的速度(mysql)

SELECT 
    (SELECT 
      time 
     FROM 
      log 
     WHERE 
      user_id = 'name' 
       AND category = 'Login' 
     ORDER BY time DESC 
     LIMIT 1 , 1) AS login_time, 
    (SELECT 
      time 
     FROM 
      log 
     WHERE 
      user_id = 'name' 
       AND category = 'Logout' 
       AND app = 'RES' 
     ORDER BY time DESC 
     LIMIT 1) AS res_logout_timea 

它目前需要10-16秒來完成和放慢我的應用程序,我可以做什麼來提高效率?我正在考慮在左邊加入同一個表格而不是使用子查詢,但我無法獲得語法。任何幫助,將不勝感激。謝謝

+0

更改使您的問題缺乏[mcve]。請不要刪除您的代碼。謝謝。 – Bugs

+0

有不同類型的子查詢;我認爲這不是https://stackoverflow.com/questions/30523739/rewriting-a-slow-sql-sub-query-in-join的重複。 (因此我的投票重新開放) –

回答

0

更妙的是

INDEX(user_id, category, time)  -- for the 1st subquery 
INDEX(user_id, category, app, time) -- for the 2nd subquery 

time列必須是最後一個;其他列的順序無關緊要。您可能,例如,有這兩個

INDEX(user_id, category, time)  -- for the 1st subquery 
INDEX(app, user_id, category, time) -- for the 2nd subquery 

以此來幫助那些需要開始app索引一些其他的查詢。

0

你應該看看你的索引。可能丟失:user_id, category, app。 由於這兩個查詢只會返回一條記錄,所以它應該非常快。

基本上,索引創建一個預先在幾個字段上排序的參考表,這有助於數據庫查找過濾或排序時的記錄。當你不使用它們時,那​​個數據庫正在進行中,這就是爲什麼你查詢需要花費大量時間。

這裏是從MySQL的官方文檔指數: MySQL Indexes documentation

+0

它的工作,謝謝。你能簡單地解釋一下添加索引或提供一個有用的鏈接嗎? – apex