我试图从基因表中找到最接近的基因,给定位置信息。这是一个例子:
SELECT chrom, txStart, txEnd, name2, strand FROM wgEncodeGencodeCompV12 WHERE chrom = 'chr1' AND txStart < 713885 AND strand = '+' ORDER BY txStart DESC LIMIT 1;
我的测试运行非常缓慢,这是有问题的。
这是EXPLAIN
带有默认索引的输出(按chrom
):
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | wgEncodeGencodeCompV12 | ref | chrom | chrom | 257 | const | 15843 | Using where; Using filesort |
使用了 Filesort 并且可能导致所有缓慢?
(chrom, txStart, strand)
我尝试通过 indexing或单独来加快排序txStart
,但它只会变慢(?)。我的理由是,txStart
它的选择性不足以成为一个好的索引,而在这种情况下,全表扫描实际上更快?
这是EXPLAIN
带有附加索引的输出:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | wgEncodeGencodeCompV12 | range | chrom,closest_gene_lookup | closest_gene_lookup | 261 | NULL | 57 | Using where |
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | wgEncodeGencodeCompV12 | range | chrom,txStart | txStart | 4 | NULL | 1571 | Using where |
表结构
CREATE TABLE
wgEncodeGencodeCompV12 bin名称chrom strand txStart txEnd cdsStart cdsEnd exonCount exonStarts exonEnds score name2 cdsStartStat cdsEndStat exonFrames chrom chrom bin名称name name2 name2(
smallint(5) unsigned NOT NULL,
varchar(255) NOT NULL,
varchar(255) NOT NULL,
char(1) NOT NULL,
int(10) unsigned NOT NULL,
int(10) unsigned NOT NULL,
int(10) unsigned NOT NULL,
int(10) unsigned NOT NULL,
int(10) unsigned NOT NULL,
longblob NOT NULL,
longblob NOT NULL,
int(11) default NULL,
varchar(255) NOT NULL,
enum('none','unk','incmpl','cmpl') NOT NULL,
enum('none','unk','incmpl','cmpl') NOT NULL,
longblob NOT NULL,
KEY(
,
),
KEY(
),
KEY(
)
)
有没有办法让这更有效?我很感激你的时间!
(更新)解决方案: 结合两个评论者的建议显着提高了运行时间。