2013-03-08 44 views
1

我有這個疑問這需要時間。下面是查詢 -在約束查詢慢?

SELECT 
    m1.mes_id, 
    m1.body, 
    m1.subject, 
    m1.frm_id AS mem_id, 
    m1.date 
FROM 
    messages_system_new m1 
WHERE 
    m1.mes_id IN 
     (SELECT 
      MAX(mn1.mes_id) AS mes_id 
     FROM messages_system_new mn1 
     WHERE 
      mn1.mem_id = '401' 
      AND mn1.frm_id != '401' 
      AND mn1.trashed_user NOT LIKE '%401%' 
      AND mn1.type = 'message' 
      AND mn1.folder = 'inbox' AND mn1.is_spam='N' 
     GROUP BY mn1.frm_id 
     ) 

發射時解釋它給

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY m1 ALL (NULL) (NULL) (NULL) (NULL) 6091 Using where 
2 DEPENDENT SUBQUERY mn1 ref mem_id,frm_id mem_id 8 const 59 Using where; Using temporary; Using filesort 

這是什麼意思,我怎樣可以提高查詢?

+0

你可以租用所涉及的表的模式 – 2013-03-08 10:22:55

+0

確保你已經創建了表'messages_system_new'中的字段'mes_id'的索引 – Lake 2013-03-08 10:24:22

+0

@Lake呀!它的主鍵(mes_id) – John 2013-03-08 10:25:50

回答

0

可能嘗試使用JOIN來代替。像這樣的東西

SELECT 
    m1.mes_id, 
    m1.body, 
    m1.subject, 
    m1.frm_id AS mem_id, 
    m1.date 
FROM messages_system_new m1 
INNER JOIN (SELECT mn1.frm_id MAX(mn1.mes_id) AS mes_id 
     FROM messages_system_new mn1 
     WHERE 
      mn1.mem_id = '401' 
      AND mn1.frm_id != '401' 
      AND mn1.trashed_user NOT LIKE '%401%' 
      AND mn1.type = 'message' 
      AND mn1.folder = 'inbox' AND mn1.is_spam='N' 
     GROUP BY mn1.frm_id 
     ) Sub1 
ON m1.mes_id = Sub1.mes_id 

messafes_system_new上的索引是什麼?

+0

非常感謝你......順便說一句! mem_id,frm_id和trashed_user已經編入索引。 – John 2013-03-08 10:37:24

+0

對於此查詢,由於前導通配符,trashed_user上的索引無用(可能適用於其他查詢)。但是,如果這是一個常見的查詢,那麼可能值得在列mem_id,frm_id,type和folder上添加一個索引。請注意,mysql只會在查詢中的表中使用一個索引,因此,如果您在mem_id上有一個索引,而在frm_id上有另一個索引,那麼只會使用其中的一個(因此在必要時使用多列索引) – Kickstart 2013-03-08 10:40:52

+0

@ Kickstart ok。 ... – John 2013-03-08 11:08:11