BLAST数据库:NCBI数据库,下载与构建本地数据库

做序列比对,数据库是弹药。没有合适的数据库,参数调得再漂亮也白搭。NCBI 提供了大量公开数据库,但线上查询偶尔会慢得让人抓狂——我个人就遇到过高峰期提交任务后排队半小时。

所以我习惯在本地搭一个库。你想想看,本地库随调随用,批量分析不受限,还能自己组合冗余版本。这一章我把下载和构建的方法整理出来,都是我踩过坑后的总结。

NCBI 数据库 → 本地 BLAST 数据库构建流程 1. 选择目标数据库 nt / nr / refseq等 2. 下载压缩文件 update_blastdb.pl 或 wget 3. 解压 .tar.gz tar -xzf 4. 构建索引 makeblastdb -in ... 5. 验证与配置 blastdbcmd -info 💡 提示:NCBI 预构建的 blastdb 可在 ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 下载, 对于 RefSeq 等数据库,官方已提供索引文件,解压即用,无需再次 makeblastdb。

NCBI 有哪些常用数据库?

说起 NCBI 的 BLAST 数据库,最常用的就是这几个:

数据库名全称典型用途大小(约)
nrNon-redundant protein通用蛋白比对~150 GB
ntNon-redundant nucleotide通用核酸比对~100 GB
refseq_proteinRefSeq protein可靠参考蛋白集~30 GB
refseq_rnaRefSeq RNA转录本比对~40 GB
swissprotUniProt Swiss-Prot高质量手工注释蛋白~5 GB

我刚开始做宏基因组时,直接用 nr 库跑 blastx,结果一次查询要两小时。后来换成 swissprot 做初步筛选,再用 nr 做第二轮,速度提升了 5 倍。选对库比调参数更有效。

下载数据库的两种方式

方式一:update_blastdb.pl 脚本(推荐)

这个 Perl 脚本能从 NCBI 自动下载并校验数据库。我第一次用的时候没加 --decompress 参数,结果下载了一堆 .tar.gz 还得自己一个个解压。

# 搜索可用数据库列表
update_blastdb.pl --showall

# 下载 nr 数据库(自动解压)
update_blastdb.pl --decompress --num_threads 4 nr

# 下载 nt 数据库并保留压缩文件
update_blastdb.pl --decompress nt

方式二:直接 wget / curl

如果脚本依赖的 Perl 模块不全,我会直接去 FTP 拉。NCBI 的 blastdb 目录下预置了索引文件,解压就能用。

# 下载 refseq_rna 的 .tar.gz 文件
wget -c ftp://ftp.ncbi.nlm.nih.gov/blast/db/refseq_rna*.tar.gz

# 解压到本地目录
tar -xzf refseq_rna.XX.tar.gz -C /path/to/blastdb/

坑点提醒: 曾经我一次性下载了 5 个大型数据库,结果磁盘空间爆了。务必先估算大小:使用 curl -sI ftp://... | grep -i content-length 获取文件大小。

本地构建 BLAST 数据库(makeblastdb)

如果你手头有自己的 FASTA 序列文件(比如基因组组装结果、转录组拼接),就需要用 makeblastdb 建索引。这是 BLAST+ 自带工具,标准命令如下:

核酸数据库(blastn 用)

makeblastdb -in my_genome.fasta \
            -dbtype nucl \
            -parse_seqids \
            -out my_genome_db

蛋白数据库(blastp / blastx 用)

makeblastdb -in my_proteins.faa \
            -dbtype prot \
            -parse_seqids \
            -out my_protein_db

-parse_seqids 参数我几乎每次都会加——它会将 FASTA 标题中的序列 ID 解析出来,方便后续用 blastdbcmd 提取和验证。

实战建议:对于大文件,加 -max_file_sz 4GB 让数据库分卷,避免单文件过大导致 I/O 瓶颈。

数据库管理与验证

建完库后,我喜欢用这几个命令做一次“体检”:

# 查看数据库基本统计信息
blastdbcmd -db my_genome_db -info

# 提取某条序列测试
blastdbcmd -db my_genome_db -entry gi|12345

# 列出所有序列 ID
blastdbcmd -db my_genome_db -list

-info 输出里会显示序列总数、总长度、以及是否使用 -parse_seqids。如果忘记加这个参数,-entry 和 -list 就用不了。

更新与维护

NCBI 的数据库每周都会更新。我写了个 cron 任务自动拉取增量包:

# 每周一凌晨3点更新 nr 库
0 3 * * 1 cd /data/blast && update_blastdb.pl --decompress --num_threads 8 nr

注意:更新时旧索引文件会被覆盖,但不会自动清理历史版本。磁盘空间紧张的话,最好在脚本末尾加一行 rm -f nr.*.tar.gz。

我个人习惯在多个本地库之间用符号链接来管理默认路径:

ln -s /data/blast/nr /blastdb/nr
export BLASTDB=/blastdb

这样 blastn 时不用每次都指定 -db 的全路径,BLAST 会自动去 $BLASTDB 下查找。

数据库选择速查表

查询类型推荐数据库原因
鉴定未知核酸序列nt包含 GenBank+ EMBL+DDBJ,覆盖面广
鉴定未知蛋白序列nr 或 swissprotnr 冗余但全,swissprot 准
比对到模式物种refseq_rna / refseq_protein非冗余且经过审核
小数据量快速测试swissprot / uniprot_sprot体积小,几十秒出结果
宏基因组短 reads 分析refseq_protein(构建为 diamond 库)结合 DIAMOND 更快

说回到参数调优——数据库选错了,后面全白费。我见过有人用 nr 库做 microbiome 的 16S 比对,结果全是真核生物 hits,因为 nr 里包含太多真核序列。后来换成 16S_ribosomal_RNA 专用库才得到正确结果。

好了,数据库到手,下一步就该调 blast 核心参数了。不过那不是本章的内容,我们下次再聊。