当文本列中的数据呈线性增长时,MySQL查询时间呈指数增长

当文本列中的数据呈线性增长时,MySQL查询时间呈指数增长,mysql,performance,Mysql,Performance,我们有一个表,目前有一个文本列,列的长度平均约为2000个字符。我们想看看,如果平均值为5k、10k、20k等,选择该列的查询的性能会如何 我们设置了一个单独的测试,发现随着文本列的长度线性增加,查询时间呈指数增长 任何人都有任何关于为什么会这样的想法。可以提供更多信息,但非常简单。这样做的原因之一可能是TEXT和BLOB字段没有与所有其他“常规”字段一起存储,因此数据库引擎实际上需要从磁盘的另一个区域提取这些字段 我们需要查看您的查询是按ID字段查找,还是在TEXT字段中搜索?在后一种情况下,

我们有一个表,目前有一个文本列,列的长度平均约为2000个字符。我们想看看,如果平均值为5k、10k、20k等,选择该列的查询的性能会如何

我们设置了一个单独的测试,发现随着文本列的长度线性增加,查询时间呈指数增长


任何人都有任何关于为什么会这样的想法。可以提供更多信息,但非常简单。

这样做的原因之一可能是
TEXT
BLOB
字段没有与所有其他“常规”字段一起存储,因此数据库引擎实际上需要从磁盘的另一个区域提取这些字段


我们需要查看您的查询是按ID字段查找,还是在
TEXT
字段中搜索?在后一种情况下,随着存储文本的平均长度的增加,数据库要处理的数据量也随之增加,并且呈指数增长。

您可以使用
限制仅选择要查看的这些字段:

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 0,30
对于接下来的30行,请执行以下操作:

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 30,30

无论如何,您永远不能一次读取10k行,这将使您的选择快得多。

这与mysql在磁盘读取周期中可以读取多少数据有关,
以及在一个数据发送周期中可以通过网络发送多少数据

当数据大小增加时,将出现更多的开销

  • 磁盘读取周期(mysql在记录查找上花费了更多时间)
  • 数据发送(需要更长的周期才能通过网络传输数据)
并非所有数据都存储在内存中,尤其是在文本和blob上,
mysql需要从磁盘中找到数据,
然后转移回客户

换句话说,mysql索引很快,

因为它不需要磁盘读取

,这是一个非常随意的猜测,但这可能是一个低级别的实现问题,MySql不希望您一次检索这么多数据,因此它必须重新分配更大的内存块以供内部使用,并将数据从旧位置复制到新位置,并随着数据的增长不断重复,这是我脑海中唯一能够解释查询时间呈指数增长而数据呈线性增长的东西。您的解决方案是限制一次检索的数据量。

您是否将全文索引与
匹配与
结合使用。这是搜索文本列的推荐方式。我们不是在文本列中搜索,只是选择它。从t中选择*,其中t.id<50;etcSELECT*是非常糟糕的表单,只选择您真正需要的字段。因为您(可能)正在通过网络发送大量不需要的数据。另外,如果您使用InnoDB,您正在扼杀使用覆盖索引的机会,还请注意@Mchl的回答。@Dan.StackOverflow:您能否提供更多关于结果(大小、时间等)和表结构(行数、记录的总大小、索引)的详细信息?@Jonah,只有两列,如果不需要,我们就不会有文本列,当然我们需要SELECT*。我们使用的是MyISAM,而不是InnoDB。ypercube,不久将添加更多信息。。。。不,它不是指数型的。。。我错了。在我的脑海里想象着其他的东西,但当开始计算时,它仍然是线性的;浇注隔离测试是一个包含两列的表:一个id列和一个文本列。我们的查询是按id从表中选择,增量为50。假设它有1000行,我们将做0