MySQL选择性能json_arrayagg与两个查询

qv7cva1a  于 2023-01-14  发布在  Mysql
关注(0)|答案(1)|浏览(163)

在mysql8.0.23中

病例1

select *
from boards b
where b.id = 11
select *
from comments c 
where c.board_id = 11

用例2

select b.*
     , c.comments
from boards b 
left outer join lateral (
  select json_arrayagg(json_object(
    'id', c.id,
    'title', c.title,
    ...
  )) as comments
  from comments c 
  where c.board_id = b.id
) c on true
where b.id = 11

哪一个更有表现力?
我对反模式或类似的东西不感兴趣。
降低连接成本并一次获取所有数据是否更好?
还是没有JSON转换成本更好
案例2在我的测试中比较快,但它只是确认了查询的响应速度。我想知道什么mysql server可以在同一时间处理更多的查询。

kmpatx3s

kmpatx3s1#

还要测试其“性能”:

( SELECT 'b', JSON_ARRAYAGG(...)  FROM b WHERE b.id=11 )
UNION ALL
( SELECT 'c', JSON_ARRAYAGG(...)  FROM c WHERE c.id=11 )
;

或者选择(选择JSON_数组(...)从B,其中b.id=11)作为bbb(选择JSON_数组(...)从c,其中c.id=11)作为ccc ;
每个人都希望你的第二个版本,因为他们避免了到服务器的第二次往返,往返是总时间的一个重要部分。
如果B和c具有相同的列(这通常是一个糟糕的模式设计),则

SELECT b.*, c.*  -- or spell out the columns
    FROM b
    JOIN c
    WHERE b.id = 11
      AND c.id = 11

这两个id是针对同一个值进行测试的,这是巧合还是故意的?

相关问题