2014-03-25 77 views
0

有人可以幫助我優化此查詢嗎?我有一張有大量數據的表格。有人可以幫助我優化,而不使用子查詢?使用子查詢優化sql by

SELECT user_id, scheduled_on_date 
    FROM 
    (SELECT user_id, scheduled_on_date 
    FROM `calls` 
    ORDER BY scheduled_on_date DESC) AS cinner 
    GROUP BY user_id 

輸出預計爲: 我需要的是用自己的最後調用scheduled_date用戶的唯一行。

回答

1

你可以重寫查詢如下

SELECT c.user_id, c.scheduled_on_date ,other_fields_max_per_group 
FROM `calls` c 
JOIN (SELECT user_id, MAX(scheduled_on_date) scheduled_on_date 
    FROM `calls` 
     GROUP BY user_id) AS cc 
ON(c.user_id =cc.user_id AND c.scheduled_on_date =cc.scheduled_on_date) 

添加複合索引

ALTER TABLE calls ADD INDEX `test` (user_id ,scheduled_on_date) 

如果你只是想最大的日期和用戶ID只能使用

SELECT user_id, MAX(scheduled_on_date) scheduled_on_date 
FROM `calls` 
GROUP BY user_id 
+1

如果您只需要'user_id'和'scheduled_on_date'可以去除其他查詢。另外,您可能希望添加「GROUP BY user_id」,以避免具有多個具有相同'scheduled_on_date'的記錄的用戶擁有多行。 – Vatev

+0

@Vatev是的,我得到你的觀點第一個查詢是爲了獲得每組最大的行 –

+0

實際上,我需要所有其他領域以及。此外,這個查詢花費的時間比我發佈的上一個查詢長得多。 – ashish

0
select c1.* 
from calls c1 left join call c2 on c1.user_id = c2.user_id 
    and c1.scheduled_on_date < c2.scheduled_on_date 
where c2.user_id is null; 

如果你想優化進一步

  • 確保您有(USER_ID,scheduled_on_date)
  • 只得到需要的列索引