2011-04-13 50 views
1
的平均

我有以下查詢:Mysql的優化查詢:試圖讓子查詢

SELECT AVG(time) FROM 
(SELECT UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time 
    FROM table 
    WHERE id IN 
     (SELECT DISTINCT id 
      FROM table 
      WHERE product_id = 12394 AND datelast > '2011-04-13 00:26:59' 
     ) 
GROUP BY id 
) 
as T 

查詢得到最大datelast值和每一個ID的最大datestart值(即長度減去它用戶會話),然後對其進行平均。

最外面的查詢只有平均結果時間。有沒有什麼辦法來優化這個查詢?從EXPLAIN

輸出:

id select_type   table  type   possible_keys   key  key_len ref  rows extra 
1 PRIMARY    <derived2> ALL    NULL     NULL NULL NULL 7 
2 DERIVED    table  index   NULL     id  16  NULL 26  Using where 
3 DEPENDENT SUBQUERY table  index_subquery id,product_id,datelast id  12  func 2  Using index; Using where 
+0

您的問題缺少信息,例如已索引的內容,您的EXPLAIN SELECT輸出內容等等。 – 2011-04-13 10:58:30

+0

更新的原文。 – Tony 2011-04-13 11:06:20

回答

0

是第一選擇真的有必要嗎?

SELECT 
    AVG(time) 
FROM 
(
    SELECT 
    UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time 
    FROM 
    table 
    WHERE 
    product_id = 12394 AND datelast > '2011-04-13 00:26:59' 
    GROUP BY 
    id 
) 

我現在不能測試,我認爲它也可以工作。否則,你的查詢看起來不錯。

您可以通過添加(datelast,product_id)鍵來優化查詢(始終首先放置限制性最高的字段,以提高選擇性)。

+0

我測試了它,它確實有所作爲,因爲在您的版本中,max(datelast)受datelast>'2011-04-13 00:26:59'條款限制。有沒有辦法解決這個問題?我只想要一個datelast值來適應子句,而不是所有的行。 – Tony 2011-04-14 02:08:35

+0

你的意思是說,當你使用你以前的查詢時,有max(datelast)<'2011-04-13 00:26:59'?這很奇怪,因爲你選擇ids where datelast>'2011-04-13 00:26:59'所以max(datelast)總是>'2011-04-13 00:26:59'。無論如何,正如我告訴過你的,我真的認爲你的第一個查詢是正確的,你可以用一個新的索引來提高性能。 – 2011-04-14 11:59:41