繁体   English   中英

使用左连接优化 Mysql 查询组连接

[英]Optimaze Mysql Query Group Concat with Left Join

这是我的查询

select image_tree.id, image_tree.parent_id, image_tree.url,
                           CONCAT(
                                '[',
                               GROUP_CONCAT(
                              JSON_OBJECT(
                                 'lang', image_tree_title.lang,
                                 'title', image_tree_title.title
                                   )
                          ), ']'
                       ) AS lang from `image_tree` 
left join `image_tree_title` on `image_tree_title`.`image_tree_id` = `image_tree`.`id` 
group by `image_tree`.`url`, `image_tree`.`id` 
order by url + 0 ASC

有人建议我删除 GROUP_CONCAT 并对 PHP 中的数据进行排序。 GROUP_CONCAT 是否会对性能产生重大影响,更好的方法是什么,我认为在 MYSQL 中准备所有数据更好,不需要在 PHP 中进行额外的循环。

你真的最好只查询你需要的字段并在客户端组装它们。 您当前的 GROUP_CONCAT 和 JSON_OBJECT 方法将更多工作放在数据库服务器上,锁定表的时间更长,并增加了必须打包并从数据库发送到客户端代码的数据量。 除非 MySQL 在连接中进行一些神奇的压缩或对 JSON 对象进行特殊打包,否则它将为您检索的每个数据值传回大量冗余的列名副本(以及格式)。

我不会说永远不要使用 GROUP_CONCAT,它甚至可以用来完成对特别弱的客户端来说可能过于昂贵的工作……但它确实会带来开销; 10000这样的原始 INT 基本上可以用 4 个字节发送,但最好的情况是字符串10000需要 5 个字节。 JSON 增加了更多开销; GROUP_CONCAT 扩展了更小的数据类型,并为分隔符添加了一点,而 JSON 做到了这一点并添加了冗余的字段命名语法。

在 SQL 中排序很好,它就是为此而构建的(尽管我认为在要求极高的系统中甚至可能会避免这种情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM