如何提高性能,让最近的记录显示在列表中,最近的前 5 名最多

How to improve performance getting recent records to display in list, recent top 5 most

我正在制作一个示例最近的屏幕,它将显示一个列表,它显示列表,id 设置为主键。

我已经按预期完成了正确的查询,但是 table 数据量大可能会导致性能下降问题。

这是下面的示例查询:

SELECT  distinct H.id    -- (Primary Key),
        H.partnerid as PartnerId,
        H.partnername AS partner, H.accountname AS accountName,
        H.accountid as AccountNo,
    FROM  myschema.mytransactionstable H
    INNER JOIN (
        SELECT  S.accountid, S.partnerid, S.accountname,
                max(S.transdate) AS maxDate
            from  myschema.mytransactionstable S
            group by  S.accountid, S.partnerid, S.accountname
               ) ms  ON H.accountid = ms.accountid
      AND  H.partnerid = ms.partnerid
      AND  H.accountname =ms.accountname
      AND  H.transdate = maxDate
    WHERE  H.accountid = ms.accountid
      AND  H.partnerid = ms.partnerid
      AND  H.accountname = ms.accountname
      AND  H.transdate = maxDate
    GROUP BY  H.partnerid,H.accountid, H.accountname
    ORDER BY  H.id DESC
    LIMIT  5

在我的例子中,有些值在所选列中相似,但仅在其 ID 上有所不同

下面是一张 link 的图片,没有执行上面的查询。它们都是尚未过滤的记录。 Sample result query click here

因为我只想通过他们的 id 获得最近的 5 个,但其他列可以包含类似的值 accountname,accountid,partnerid.

我已经得到了正确的查询,但是, 我想提高查询的性能。有什么改进查询的建议吗?

您可以尝试使用 row_number()

select * from
(
select *,row_number() over(order by transdate desc) as rn
from myschema.mytransactionstable
)A where rn<=5
  • 不要重复 ON 和 WHERE 子句。使用 ON 表示表(或子查询)是如何“相关”的;使用 WHERE 进行过滤(即保留哪些行)。可能在你的情况下,所有 WHERE 都应该被删除。

  • 请提供SHOW CREATE TABLE

  • 这个 'composite' 索引可能会有所帮助,因为处理子查询和 JOIN:

      INDEX(partnerid, accountid, accountname, transdate)
    
  • 这也可以避免对 GROUP BY 进行单独排序。

  • 但是ORDER BY不一样,所以不能避免排序。

  • 可能避免排序而不改变结果集顺序:ORDER BY partnerid, accountid, accountname, transdate DESC

  • 如有其他问题,请提供EXPLAIN SELECT ...EXPLAIN FORMAT=JSON SELECT ...

如果我们无法获得索引来处理 WHERE、GROUP BY、 ORDER BY,查询将在看到 LIMIT 5 之前生成所有行。如果索引确实有效,那么 outer 查询将在 5 之后停止——可能会节省大量资金。