您的当前位置:首页正文

mysql 处理大数据太慢_科研测序芯片数据处理,你用了MySql了吗

来源:华佗健康网

写在文前:在处理测序数据,或者仪器采集的大量数据时,常规操作费时费力。我们需要借助多个工具来实现快速处理,稍微有点学习成本(需要简单地了解数据结构,SQL,Shell,R,Python,Java以及大数据),不过跟着农大芸来,事情就会简单很多。(省出来的时间你可以用来:看文献,看网课,追剧,花前月下...)

本次所需要的软件及编程语言如下

MySql 5.7navicat 15Shell 语言SQL 语言

正文:
盼望着,盼望着,关联分析的SNP测序数据回来了~

400M的txt格式文件~

于是我们试一下notepad ++ 打开看看:

算了,还是去Linux中查看下数据内容(Linux安装:不要虚拟机,不要双系统!在你的Windows上使用Linux如此简单)

$ less -S clean.hmp.txt

查看总行数(包括head)

$ less -S clean.hmp.txt | wc -l397741

实验需求:

矩阵第一列rs# 是SNP芯片编号,需要筛选出特定的芯片数据(500列)。即在近40万行数据中找到符合条件的几十个芯片数据。

解决:

下文提供2种方法,每种方法可以借鉴到其他需求中。若时间有限可直接跳转到Plan B

Plan A:

Excel中VlookUp函数。还好平时学习积累,第一时间想到日常数据分析工具。但是,这么大的文件仅Excel加载就已经崩溃,更何况再使用全文精确查找函数。忽然间又想到拆分(如果数据量小,大家可以采取此方法),我们可以将不同染色体编号拆分出来,然后再使用VlookUp函数,这样会比直接使用减少更多运算量。

有童鞋可能会问:怎么拆分呢?要是使用Excel的筛选功能还是很慢呀!

莫慌,这里使用Linux中的awk可以快速切分(全过程6S搞定):

# awk过滤数据, 写入chrom1.txt文件中. 其中NR==1{print}为输出表头, $3==1 {print}为过滤第三列即chrom=1$ less -S clean.hmp.txt |awk 'NR==1{print} $3==1 {print}' | less -S > chrom1.txt# 查看输出文件行数,与mysql查询相互印证(附图)$ less -S chrom1.txt | wc -l27510

有童鞋可能看到这两个查询出行数不同呀!需要解释下,chrom.txt包含表头,所以会多出一行来。拆分后的文件仅27M,Excel操作相比以前已经快了很多(Vlookup使用方法可百度,学习成本极低),可是还是忍受不了,毕竟小麦染色体一共有21条,那么切分21个文件,然后每个再打开分析?一两个还行,太多了头就大了!

Plan B:

既然我们想要在40万行数据中筛选出来需要的几十个标记数据,那么使用数据库是最佳选择。

开始操作:

0、MySQL安装

我们这次使用云服务器进行实战操作,Ubuntu安装mysql简单易行,度娘不乏教程,此处省略。

1、在数据库中创建表及表结构

-- 主要代码 line2-line492 同line1CREATE TABLE `gene_chip`  (  `rs#` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `alleles` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `chrom` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `pos` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `strand` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `assembly#` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `center` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `protLSID` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `assayLSID` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `panelLSID` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `QCcode` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `line1` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  ...  `line493` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  INDEX `idx_gene`(`rs#`, `chrom`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2、使用navicat工具连接数据库

3、数据导入

4、创建索引(该步骤可显著提升查询速度)

在漫长的上传过程(20分钟)结束后,我们首先要对数据进行校验,此处仅核对总行数即可。

因为该数据集只进行查询,而不进行insert、update等操作。所以我们建立索引,提升查询速度。sql命令如下:

# 在MySQL命令框下执行create index idx_gene on gene_chip(`rs#`,chrom);# 执行结果如下Query OK, 0 rows affected (6.69 sec)Records: 0  Duplicates: 0  Warnings: 0

创建索引完毕后,我们可以查看所建立的索引。

show index from gene_chip;+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| gene_chip |          1 | idx_gene |            1 | rs#         | A         |      368504 |     NULL | NULL   | YES  | BTREE      |         |               || gene_chip |          1 | idx_gene |            2 | chrom       | A         |      368504 |     NULL | NULL   | YES  | BTREE      |         |               |+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+2 rows in set (0.00 sec)

5、实现需求

我们查询10个标记来做测试,查询耗时0.16秒,sql如下:(数据脱敏,仅示例代码)

SELECT * FROM `gene_chip` WHERE `rs#` IN ('874','41314','061745','13705','41','24107','503','671','60751','9827')

5.1 查询数据导出

写在文末

清代彭端淑在《为学一首示子侄》说“天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。”

因篇幅问题不能全部显示,请点此查看更多更全内容