BLAST数据库:NCBI数据库,下载与构建本地数据库
做序列比对,数据库是弹药。没有合适的数据库,参数调得再漂亮也白搭。NCBI 提供了大量公开数据库,但线上查询偶尔会慢得让人抓狂——我个人就遇到过高峰期提交任务后排队半小时。
所以我习惯在本地搭一个库。你想想看,本地库随调随用,批量分析不受限,还能自己组合冗余版本。这一章我把下载和构建的方法整理出来,都是我踩过坑后的总结。
NCBI 有哪些常用数据库?
说起 NCBI 的 BLAST 数据库,最常用的就是这几个:
| 数据库名 | 全称 | 典型用途 | 大小(约) |
|---|---|---|---|
| nr | Non-redundant protein | 通用蛋白比对 | ~150 GB |
| nt | Non-redundant nucleotide | 通用核酸比对 | ~100 GB |
| refseq_protein | RefSeq protein | 可靠参考蛋白集 | ~30 GB |
| refseq_rna | RefSeq RNA | 转录本比对 | ~40 GB |
| swissprot | UniProt 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 或 swissprot | nr 冗余但全,swissprot 准 |
| 比对到模式物种 | refseq_rna / refseq_protein | 非冗余且经过审核 |
| 小数据量快速测试 | swissprot / uniprot_sprot | 体积小,几十秒出结果 |
| 宏基因组短 reads 分析 | refseq_protein(构建为 diamond 库) | 结合 DIAMOND 更快 |
说回到参数调优——数据库选错了,后面全白费。我见过有人用 nr 库做 microbiome 的 16S 比对,结果全是真核生物 hits,因为 nr 里包含太多真核序列。后来换成 16S_ribosomal_RNA 专用库才得到正确结果。
好了,数据库到手,下一步就该调 blast 核心参数了。不过那不是本章的内容,我们下次再聊。