繁体   English   中英

mysql - 创建行与列性能

[英]mysql - Creating rows vs. columns performance

我构建了一个分析引擎,从我的数据库中提取50-100行原始数据(让我们称之为raw_table ),在PHP上运行一系列统计测量,然后提出140个数据点,然后我需要存储在另一个表中(我们称之为results_table )。 所有这些数据点都是非常小的整数(“40”,“2.23”,“ - 1024”是数据类型的好例子)。

我知道mysql的最大列数非常高(4000+),但是当性能真正开始降低时,似乎有很多灰色区域。

这里有一些关于最佳性能实践的问题:

1)如果更好,140个数据点可以分成20行7个数据点,如果更少的列更好,则所有数据点都具有相同的“ experiment_id ”。 但是我总是需要拉动所有20行(每行7列,加上id等),所以我不认为这比拉动1列140列更好。 所以问题是:最好存储20行7-9列(这些都需要一次拉出)或1行140-143列?

2)鉴于我的数据示例(“40”,“2.23”,“ - 1024”是将要存储的内容的良好示例)我正在考虑结构类型的smallint 那里的任何反馈,表现方面还是其他方面?

3)欢迎任何有关mysql性能问题或提示的其他反馈。

提前感谢您的意见。

我认为存储更多行(即标准化)的优势取决于面对变化时的设计和维护考虑因素。

此外,如果140列具有相同的含义或每个实验不同 - 根据规范化规则正确建模数据 - 即数据如何与候选键相关。

就性能而言,如果使用所有列,则会产生很小的差异。 有时,对于大量数据,pivot / unpivot操作可能是昂贵的,但它对单个密钥访问模式几乎没有什么区别。 有时,数据库中的数据透视表可以使您的前端代码更加简单,并且后端代码在变更时更加灵活。

如果你有很多NULL,那么可以消除规范化设计中的行,这样可以节省空间。 我不知道MySQL是否支持稀疏表概念,它可以在那里发挥作用。

每次返回140个数据项,每个类型为double。

这对于1x140或20x7或7x20或4x35等没有实际区别。对于一种形状当然可以无限快,但是你考虑了PHP代码中处理不同形状的额外复杂性。

您是否有经过验证的瓶颈,或者这只是随机过早优化?

您没有建议您打算在数据库中存储大数据,但出于这个论点的目的,我假设您有10亿(10 ^ 9)个数据点。

如果将它们存储在140列中,则只有7行,但是,如果要从大量实验中检索单个数据点,则必须获取大量非常宽的行。

这些非常宽的行将占用你的innodb_buffer_pool中更多的空间,因此你将无法缓存这么多; 当您再次访问它们时,这可能会减慢您的速度。

如果每行存储一个数据点,在列数很少的表(experiment_id,datapoint_id,value)中,则需要拉出相同数量的较小行。

但是,行的大小对所需的IO操作数量几乎没有影响。 如果我们假设您的10亿个数据点不适合ram(现在这不是一个安全的假设),那么结果性能可能大致相同。

使用少量列可能是更好的数据库设计; 但是如果使用大量的列,它将使用更少的磁盘空间并且可能更快填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM