我在生物实验室工作,我必须设计一个数据库来存储许多 DNA 微阵列实验结果。
每个实验都由许多微阵列(平均约十个)组成,每个微阵列包含超过 500 万个探针。每个探针都映射到一个特定的基因 id,当然在所有实验中相同的探针匹配相同的 gene_id。目的是存储每个微阵列的强度值,以便能够在特定实验中快速检索特定基因id的探针的强度值。
事实上,一个简单的 mysql 表就足够了,它看起来像这样:
强度表: |probe_id|experiment_id|microarray_id|gene_id|intensity_value
主键由(probe_id, experiment_id, microarray_id, gene_id)组成
这是问题所在:每个实验都有许多微阵列,其中有超过 500 万个探针。通过 1000 次实验,平均 10 个微阵列(这是一个低估计,有些有数百个),它的 1000 * 10 * 5M = 500 亿行。估计会很慢而且我完全不知道如何处理数十亿行的 mysql 表。那可能吗 ?有什么建议吗?
我也对 noSQL 数据库很好奇。我从未使用过 cassandra,但在我看来它非常适合这项任务,对吗?我可以想象这样一个 shema :
{
experiment_id_1:{ <- thats a super collumnFamilly ?
gene_id_1:{ <- thats a collumnFamilly ?
probe_id_1:{ value_microarray_1, value_microarray_2, ... }, <- thats a superCollumn ?
probe_id_2:{ value_microarray_1, value_microarray_2, ... },
probe_id_3:{ value_microarray_1, value_microarray_2, ... },
...
},
gene_id_2:{
probe_id_1:{ value_microarray_1, value_microarray_2, ... },
probe_id_2:{ value_microarray_1, value_microarray_2, ... },
probe_id_3:{ value_microarray_1, value_microarray_2, ... },
...
}
}
experiment_id_2{
...
}
...
}
我说得对吗?它适合 Cassandra 模型吗?会有效率吗?你怎么看 noSQL 专家 :)
谢谢。
最佳答案
在这种方法中,我还会考虑基于 NoSQL 数据库的关系。如果您做出一些考虑,您将能够检查您是否能够处理数据:
- 表格的预期大小是多少,为了大致了解,请检查一组数据的大小,并通过将其乘以数据集的总预期数量来计算总体大小。
- 计算索引的大小
- 现在检查一下,如果您的服务器能够在 RAM 中处理这些索引或更好,请在 RAM 中处理整个表。
- 此表上的 DML/选择操作之间的比率是多少
- 确保您制定了处理备份、优化和更改此类表格等常见任务的策略。
如果我必须处理这种情况,我通常会生成一些与我希望在我的表中具有的数据相似的测试数据,并使用不同的服务器参数进行测试。我也考虑使用 partitioning of tables在这种情况下(例如对 experiment_id 进行分区。这将导致表拆分为更小的子集,这可以通过现有的硬件边界来处理。你不敢自己做这个,MySQL 可以为你做这个并且该表将作为单个表呈现给用户。但是机器只需要处理存储给定 experiment_id 的数据集的部分。这会导致更快的 I/O 等。
我已经看到机器可以轻松处理比您预期的行数多得多的表,但是您必须仔细规划此类设置,并且通常需要大量测试/优化/重新设计才能将其投入生产.但付出这种努力总是值得的,因为这是一件非常有趣的事情。
(我在学习期间处理 embl 数据时第一次接触了这个领域,这成为了我的热情;))
关于mysql - 数十亿行 mysql 表/cassandra 模型-(以及一些生物学知识 :)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028061/