mysql - 数十亿行 mysql 表/cassandra 模型-(以及一些生物学知识 :))

标签 mysql nosql cassandra

我在生物实验室工作,我必须设计一个数据库来存储许多 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 数据库的关系。如果您做出一些考虑,您将能够检查您是否能够处理数据:

  1. 表格的预期大小是多少,为了大致了解,请检查一组数据的大小,并通过将其乘以数据集的总预期数量来计算总体大小。
  2. 计算索引的大小
  3. 现在检查一下,如果您的服务器能够在 RAM 中处理这些索引或更好,请在 RAM 中处理整个表。
  4. 此表上的 DML/选择操作之间的比率是多少
  5. 确保您制定了处理备份、优化和更改此类表格等常见任务的策略。

如果我必须处理这种情况,我通常会生成一些与我希望在我的表中具有的数据相似的测试数据,并使用不同的服务器参数进行测试。我也考虑使用 partitioning of tables在这种情况下(例如对 experiment_id 进行分区。这将导致表拆分为更小的子集,这可以通过现有的硬件边界来处理。你不敢自己做这个,MySQL 可以为你做这个并且该表将作为单个表呈现给用户。但是机器只需要处理存储给定 experiment_id 的数据集的部分。这会导致更快的 I/O 等。

我已经看到机器可以轻松处理比您预期的行数多得多的表,但是您必须仔细规划此类设置,并且通常需要大量测试/优化/重新设计才能将其投入生产.但付出这种努力总是值得的,因为这是一件非常有趣的事情。

(我在学习期间处理 embl 数据时第一次接触了这个领域,这成为了我的热情;))

关于mysql - 数十亿行 mysql 表/cassandra 模型-(以及一些生物学知识 :)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028061/

相关文章:

php - MYSQL从数据库检索数据时如何忽略foreach循环中的重复行

c# - RavenDB 附件 - 功能怎么做?

mongodb - 单个计数器最快的 nosql

cassandra - 集群中的两个节点向彼此显示 DN,向其他所有人显示 UN

scala - 如何使用 Spark Cassandra 连接器创建表?

mysql - Wordpress 自定义 wp_users、wp_usermeta 加入排序不正确

mysql - 分组但仅计算事件行-SQL

java - 为什么我得到一个从打开的 MySQL 连接关闭的 java.sql.PreparedStatement?

sql - 何时对 BI 数据使用 NoSQL 与 SQL

docker - 如何从 Cassandra 数据库的 Docker 镜像将 .CSV 文件获取到本地计算机