2013-03-08 97 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