遺伝子テーブルから、位置情報を指定して最も近い遺伝子を見つけようとしています。次に例を示します。
SELECT chrom, txStart, txEnd, name2, strand FROM wgEncodeGencodeCompV12 WHERE chrom = 'chr1' AND txStart < 713885 AND strand = '+' ORDER BY txStart DESC LIMIT 1;
私のテストの実行はかなり遅く、問題があります。
これは、EXPLAIN
デフォルトのインデックス付け(by 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)
するか、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 name chrom chrom bin name name name2 name2 cdsStart cdsEnd exonCount exonStarts exonEnds score name2 cdsStartStat cdsEndStat exonFrames chrom chrom bin name 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(
)
)
これをより効率的にする方法はありますか?お時間をいただきありがとうございます!
(更新)解決策: 両方のコメント投稿者の提案を組み合わせると、実行時間が大幅に改善されました。