GWAS阵列数据库高效构建方案及MySQL适用性咨询
Hey Manu, let's walk through how to tackle this problem—your 20K-sample, 1M-marker GWAS dataset is a classic high-dimensional bioinformatics challenge, and MySQL alone isn't going to cut it for the raw numeric data. Let's break down the options:
First, why MySQL isn't the best fit for raw numeric storage
Your dataset is a 20,000×1,000,000 matrix—20 billion data points total. Here's why MySQL struggles here:
- Row storage inefficiency: MySQL is built for row-based storage, which is terrible for your core use case (pulling small subsets of samples). If you structure data as one row per marker (with 20K columns for samples), MySQL hits its hard column limit (4096 columns) immediately. If you use one row per sample-marker pair, you're looking at 20 billion rows—querying even a handful of samples would require scanning millions of rows, which is glacially slow.
- Poor compression for homogeneous data: Numeric GWAS values (genotypes, intensity scores) are highly repetitive, but MySQL's default compression doesn't optimize for this anywhere near as well as specialized formats or column stores.
Recommended solutions, tailored to your needs
Your goal is to serve small subsets of samples and support multi-variable queries—here are the most efficient paths:
1. Use GWAS-standard file formats (cheapest, most efficient)
The bioinformatics community has already solved this problem with specialized formats designed for exactly this kind of data:
- PLINK bed/bim/fam: This is the gold standard for microarray GWAS data. The
bedfile is a binary compressed format that stores genotype data in just 2 bits per sample-marker pair (your 20B points would take ~5GB total—way smaller than raw MySQL storage). Thebimfile stores marker metadata (chromosome, position, rsID), andfamstores sample metadata (your dozens of variables like age, phenotype, cohort).- You can wrap tools like PLINK or Python libraries (e.g.,
pyplink) in your web service to handle queries: first filter samples using thefammetadata, then extract their marker values from thebedfile. It's fast, mature, and requires zero database setup beyond basic file storage.
- You can wrap tools like PLINK or Python libraries (e.g.,
2. Columnar databases (for SQL-friendly flexibility)
If you need full SQL query support (instead of relying on bioinformatics tools), columnar databases are the way to go. They store data by columns instead of rows, so querying a small number of samples (columns) only reads the relevant data, not entire rows. Top options:
- ClickHouse: Open-source, blazingly fast, and optimized for analytical queries. You can structure your table with marker metadata (chromosome, position) as rows, and each sample's value as a column. It supports high compression ratios for numeric data and handles multi-variable filters seamlessly.
- Vertica/AWS Redshift: Commercial options with enterprise-grade support, but overkill if you're working with a smaller team or budget.
3. Hybrid architecture (if you need to keep MySQL in the stack)
If you already have a MySQL infrastructure and want to leverage it for metadata management:
- Store all sample/marker metadata (your dozens of query variables: age, phenotype, marker chromosome, etc.) in MySQL. This is a small dataset (20K samples + 1M markers = trivial for MySQL) and makes multi-variable filtering fast and easy.
- Store the raw numeric matrix in a PLINK
bedfile or columnar database. Your web service first uses MySQL to filter down to the samples/markers the user wants, then pulls the corresponding numeric values from the specialized storage.
Final Recommendation
- If you don't need SQL support: Go with PLINK formats. It's the most efficient, industry-standard approach, and you'll avoid reinventing the wheel.
- If you need SQL flexibility: Use ClickHouse for both metadata and numeric storage—it's open-source, fast, and designed for exactly this kind of high-dimensional analytical workload.
- Avoid using MySQL for the raw numeric data alone—it'll lead to slow queries and wasted storage.
内容的提问来源于stack exchange,提问作者Manu

