MySQL 查询结果获取时间远远超过执行时间,如何解决这个问题?

问题描述 投票:0回答:1

我使用 MySQL 8.0.27-18,以 InnoDB 作为引擎。我有一个巨大的数据库,其中有几个表包含 1 亿多行。例如:TABLE_A 具有 110M 行,TABLE_B 具有 300M+ 行。有时我实际上必须连接这些表,最糟糕的是,需要对结果进行排序。

我不想从复杂的查询开始,而是想从像下面的 SELECT 语句这样的简单查询开始,

SELECT MERCH_NUM,TRANS_DATE, TRANS_AMOUNT, ETC...  FROM TABLE_A WHERE MERCH_NUM = 'XXXXYYYYZZZZ' ;

此表 TABLE_A 有 110M 行,给定的 MERCH_NUM 有约 9M 行。此外,我们在 MERCH_NUM 列上也有一个索引。 现在,我可以以几分钟的成本执行此查询。所以,当我查看统计数据时,我看到如下。

持续时间/获取

0.78 秒/270.782 秒

据我了解,MySQL 花费了不到 1 秒的时间来完成查询执行,但如果我没记错的话,则需要很长时间才能获取或检索或将结果数据传输到客户端。

这个获取部分现在成为我的应用程序的一个巨大瓶颈。

是什么导致了如此巨大的获取时间,特别是在处理大量数据时?还有,如何解决这个问题?

P.S:我们的服务器分配了 24GB RAM。

mysql query-optimization database-performance sql-fetch
1个回答
0
投票

获取结果集的第一行是一个亚秒级的操作,因此这表明索引已用于满足您的查询。

获取其余行看起来需要 4.5 分钟。这表明您的结果集有很多行和大量数据。从评论看来你正在获取九个巨树?

很多因素都会减慢大量数据的获取速度。一方面,它必须通过网络移动。接收它的程序必须对其执行某些操作,例如将其写入文件,或者为其分配 RAM。在程序读取最后一行之前,获取步骤无法完成。但您没有提到您的程序如何处理数据,因此很难确切知道您的速度下降的原因是什么。

无论如何,没有什么奇怪的 SQL 巫术可以使批量数据传输瞬间完成。您可能应该考虑采用一种不同的方式来获取结果,而不涉及转移巨行。通常,您所说的“复杂”查询可以通过适当的索引很快得到满足。

或者,做好此类操作需要时间的准备。

© www.soinside.com 2019 - 2024. All rights reserved.