哪个是执行三重连接查询的最佳性能设置

Posted

技术标签:

【中文标题】哪个是执行三重连接查询的最佳性能设置【英文标题】:Which is the best performance settings to perfom a triple join query 【发布时间】:2021-09-08 09:03:30 【问题描述】:

大家好,我正在做一个个人项目,但现在我几乎完成了所有工作,除了这个,我有 2 张桌子

用户

id name
1 john
2 doe

账单

id month status
1 january paid
2 february pending
3 march pending

但我试图向用户提供此信息的摘要,这将是最佳性能设置

    执行三联查询 例如

    选择 u.name,a.*,b.* 来自用户 左加入(从 status='paid' 的账单中选择 id,max(month) as last_month_paid)a 关于 u.id=a.id 左加入(从 status='pending' 的账单中选择 id,min(month) as last_month_pending)b 关于 u.id=b.id

    或创建 3 个数据库视图 a.已付帐单视图 b.未决账单视图 c.summary 视图 感谢您的 cmets

【问题讨论】:

视图对提高性能没有任何作用 此外,没有与给定用户和账单的关联。我可以看到唯一的账单 ID,但没有给定账单 ID 的用户 ID。 假设您的month 列是varchar,那么在此列上应用MAX()MIN() 是无稽之谈,因为四月总是最小值,九月总是最大值. 我认为视图更省时,没有关联,因为我没有写下来,但存在于表和月份字段中它是 int 【参考方案1】:

这样改写:

select  name,
        ( SELECT  max(month)
            from  bills
            where  status='paid'
              AND  id = u.id )  AS last_month_paid
        ( SELECT  min(month) as last_month_pending
            from  bills
            where  status='pending'
              AND  id = u.id )  AS last_month_pending
    from  users u

如果您需要其他列,它会变得更加复杂。看看我添加的那个标签。

【讨论】:

以上是关于哪个是执行三重连接查询的最佳性能设置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用has_many通过关系缩短三重连接ActiveRecord查询?

如何在三重内连接表中显示适当的数据?

内连接时非聚集索引的查询性能

MYSQL性能调优04_连接器查询缓存分析器优化器执行器

多个连接和联合的查询性能真的很差,有没有其他方法可以提高执行时间?

带有连接和group by子句的选择查询中的MySQL性能问题