2013-08-30 51 views
0

查詢是通過思考sphinx生成的。我正在尋找加快此查詢的方法。它幾乎需要永遠返回結果。有什麼辦法可以優化這個嗎?加快MYSQL左連接包含100K +記錄的查詢

SELECT 
    SQL_NO_CACHE `meetings`.`id` * CAST(8 AS SIGNED) + 3 AS `id`, 
    GROUP_CONCAT(DISTINCT IFNULL(CONCAT_WS(' ', `members`.`first_name`, `members`.`last_name`), '0') SEPARATOR ' ') AS `mentor_name`, 
    `meetings`.`id` AS `sphinx_internal_id`, 
    0 AS `sphinx_deleted`, 
    984144037 AS `class_crc`, 
    `meetings`.`program_id` AS `program_id`, 
    UNIX_TIMESTAMP(`meetings`.`start_time`) AS `start_time`, 
    `meetings`.`active` AS `active`, 
    `meetings`.`calendar_time_available` AS `calendar_time_available`, 
    `meetings`.`group_id` AS `group_id` 
FROM `meetings` 
LEFT OUTER JOIN `member_meetings` 
    ON `member_meetings`.`meeting_id` = `meetings`.`id` 
LEFT OUTER JOIN `members` 
    ON `members`.`id` = `member_meetings`.`member_id` 
WHERE 
    `meetings`.`delta` = 0 
GROUP BY 
    `meetings`.`id` 
ORDER BY NULL 

計數

select count(*) from meetings : 194685 
select count(*) from member_meetings : 522309 
select count(*) from members : 112016 

編輯

我想通了這個問題,我把所有的合適的索引正確配置的加入

重複的索引鍵成員_meetings.meeting_id和member_meetings.member_id,原來當使用add_index方法時,在軌道ActiveRecord :: Migration中存在一個錯誤。現在我已刪除重複的索引鍵,查詢響應時間僅爲4秒

+0

指標心中永遠的性能,此查詢與GROUP BY子句的一個問題,所以其結果不會是你所期望的;將所有非聚合列添加到組條件 – Bohemian

回答

2

確保您有

`member_meetings`.`meeting_id` 
`meetings`.`id` 
`members`.`id` 
`member_meetings`.`member_id` 
`meetings`.`delta` 
+1

我有所有這些索引,但添加了重複的索引鍵,結果發現在使用add_index方法時,在ActiveRecord :: Migration rails中存在一個錯誤。我現在已經刪除了重複的索引鍵,查詢響應時間只有4s –

+0

因此檢查索引是答案,而不是添加它們,你必須刪除重複。 – Dijkgraaf