如何提高性能,让最近的记录显示在列表中,最近的前 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 之后停止——可能会节省大量资金。
我正在制作一个示例最近的屏幕,它将显示一个列表,它显示列表,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 之后停止——可能会节省大量资金。