大量列,全选将永远

时间:2019-07-31 06:55:28

标签: mysql query-optimization mysql-workbench

我的表格中有210列,大约有10000行。每行都是唯一的,并且表上有一个主键。事情是,我们总是不得不选择表上的所有查询来获取所有站点的数据。

当前,问题在于这需要花费太多时间,返回的数据大约为10mb,将来还会很大。

该表中包含varchar,文本和日期类型。

有什么办法可以修改结构或某些东西来使检索更快。更多索引或分解表。 (尽管我认为非规范化数据很适合检索)

更新:“ 为什么宽表会降低查询性能?

谢谢..

1 个答案:

答案 0 :(得分:2)

  

为什么宽表会降低查询性能?

InnoDB以不同的方式存储“宽”表。它执行以下操作,而不是将所有列都放在一个字符串中(加上开销,例如长度等),

  • 如果给定行的所有列的总和超过8KB,它将把一些数据移到另一个(“记录外”)存储区域。
  • 哪些列移出记录外取决于列的大小,等等。
  • 详细信息取决于所选的ROW_FORMAT
  • “未记录”是另一个16KB块。
  • 稍后,当执行SELECT *(或至少获取未记录的列)时,它必须再次进行磁盘提取。

该怎么办?

  • 重新考虑有这么多列。
  • 考虑“垂直分区”,其中您具有另一个包含选定的TEXT列的表。建议根据应用程序中的访问模式来选择列组。
  • 对于通常很长的列,请考虑在客户端中将其压缩并存储到BLOB而不是TEXT中。大多数“文字”以3:1缩小。斑点的发送与文本相同,但这些压缩的斑点会更小,因此溢出的可能性较小。
  • 在SQL中进行更多处理-避免返回所有行,或避免返回全文等。在盲目地将大量文本推给客户端时,网络和客户端成为耗时的重要因素,不只是SELECT本身。