2016-05-18 203 views
1

我有一个messages表三个字段优化GROUP_CONCAT查询

消息

  • idmessage
  • 文本
  • 文件

files字段可以01,它的设置为0message does not have files attached1当它does

然后,我有一个messages_files表三个字段

messages_files

  • ID
  • idmessage

  • 文件

    ID就是主autoincremental密钥,idmessage是消息的ID,file是文件的名称。

我想列出消息及其文件(如果有的话)。下面的查询工作正常:

SELECT m.*, GROUP_CONCAT(mf.file SEPARATOR ',') AS fileList 
FROM messages m 
LEFT JOIN messages_files mf ON mf.idmessage = m.idmessage 
GROUP BY m.idmessage; 

我的问题是:由于文件表消息设置为0时,该消息没有文件,我可以“跳过” JOIN的那些行,从而使查询更快?

谢谢!

编辑:message_filesidmessage场(这是一个外键)的索引。

回答

1

这可能会使用相关子查询更快:

SELECT m.*, 
     (SELECT GROUP_CONCAT(mf.file SEPARATOR ',') 
     FROM messages_files mf 
     WHERE mf.idmessage = m.idmessage 
     ) as fileList 
FROM messages m; 

这可以再取上messages_files(idmessage, file)指数的优势。

+0

在此查询上使用* EXPLAIN *会在主查询中返回一个ALL类型,并且不使用任何键。 – Koas