mysql - 优化 GROUP_CONCAT 查询

标签 mysql query-optimization group-concat

我有一个包含三个字段的 messages

消息

  • 身份信息
  • 正文
  • 文件

files字段可以是01,当消息时设置为0没有附加文件1

然后我有一个包含三个字段的messages_files

消息文件

  • 编号

  • 身份信息

  • 文件

    id 只是一个主要的自动增量键,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;

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

谢谢!

编辑:message_filesidmessage 字段上有一个索引(它是一个外键)。

最佳答案

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

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) 上的索引。

关于mysql - 优化 GROUP_CONCAT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299387/

相关文章:

mysql - 在具有多个连接的同一查询中对数据进行分组

UNION 的 MySql CONCATENATE 结果

php - 需要重新认证 : INSERT base64 to BLOB in mySQL database

php - 如何在没有 javascript 处理的情况下使用多插入内部函数 PDO PHP 显示成功

java - SQL 连接错误,凭据正确,所有权限和访问权限均正确

postgresql - 选择主键 :Why postgres prefers to do sequential scan vs index scan

postgresql - 大数据集的空间连接查询优化

PHP。如何从 2 个 mysql 表而不是 1 个表中获取数据

mysql - 为什么在对 SQL 查询 + 优化查询使用 LIMIT 时扫描类型从 ALL 更改为 RANGE

mysql - 在 mysql 的 WHERE 子句中使用子查询