2010-11-08 2 views
3
geneHomology 
============ 
id genome_name gene_id homolog_genome_name homolog_gene_id consider_homolog 
1 HomoSap  1007  MusMus    824    1 
2 HomoSap  1007  MusMus    825    1 
3 HomoSap  1007  MusMus    826    1 
4 HomoSap  2890  EColi    2140   1 
... 

gene 
==== 
genome_name gene_id gene_category 
MusMus  823  Upregulated 
MusMus  824  Downregulated 
MusMus  825  Normal 
MusMus  826  Normal 
MusMus  827  Upregulated 
EColi  2140  Normal 
... 

consider_homolog является перечислением (0,1). genome_name и gene_id являются первичными ключами в gene. geneHomology очень большой - около 200 М строк.Как ускорить этот запрос MySQL?

Моя цель - подсчитать для каждого гена в genes, сколько гомологов у него есть у каждого gene_category.

Например, следующие данные HomoSap 1007 имеет 3 Normal гомологи и 1 Downregulated.

Так что мой запрос:

SELECT a.id,a.genome_name,a.gene_id,a.homolog_genome_name,a.homolog_gene_id,COUNT(b.gene_category) 
FROM geneHomology a,gene b 
WHERE a.consider_homolog='1' AND a.homolog_genome_name=b.genome_name AND a.homolog_gene_id=b.gene_id 
GROUP BY a.genome_name,a.gene_id,b.gene_category; 

Он никогда не возвращается (и я терпеливо ждал больше часа).

Я уже проиндексировал gene_category в gene.

Я действительно новичок в MySQL, но у меня есть корень доступа к БД, поэтому я мог бы следовать вашим предложениям (тщательно ...). Я был бы рад предоставить любую дополнительную информацию.

ОБНОВЛЕНИЕ Это EXPLAIN выход для запроса:

+----+-------------+-------+------+-----------------------+----------------------+---------+----------------------------------------------------------+---------+---------------------------------+ 
| id | select_type | table | type | possible_keys   | key     | key_len | ref              | rows | Extra       | 
+----+-------------+-------+------+-----------------------+----------------------+---------+----------------------------------------------------------+---------+---------------------------------+ 
| 1 | SIMPLE  | b  | ALL | PRIMARY,gene_genome | NULL     | NULL | NULL              | 1560695 | Using temporary; Using filesort | 
| 1 | SIMPLE  | a  | ref | geneHomologyHit_gene | geneHomologyHit_gene | 54  | my_db_v71.b.gene_id,my_db_v71.b.genome_name    |  13 | Using where      | 
+----+-------------+-------+------+-----------------------+----------------------+---------+----------------------------------------------------------+---------+---------------------------------+ 

ОБНОВЛЕНИЕ 2

mysql> SHOW INDEX FROM gene; 
    +-------+------------+--------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+ 
    | Table | Non_unique | Key_name     | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
    +-------+------------+--------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+ 
    | gene |   0 | PRIMARY     |   1 | gene_id    | A   |  NULL |  NULL | NULL |  | BTREE  |   | 
    | gene |   0 | PRIMARY     |   2 | genome_name   | A   |  1560695 |  NULL | NULL |  | BTREE  |   | 
    | gene |   1 | gene_organism   |   1 | taxon_id   | A   |   392 |  NULL | NULL |  | BTREE  |   | 
    | gene |   1 | gene_genome    |   1 | genome_name   | A   |   853 |  NULL | NULL |  | BTREE  |   | 
    | gene |   1 | gene_gene_category  |   1 | gene_category  | A   |   5 |  NULL | NULL |  | BTREE  |   | 
    +-------+------------+--------------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+ 
    5 rows in set (0.01 sec) 

ОБНОВЛЕНИЕ 3

mysql> SHOW INDEX FROM geneHomology; 
+--------------+------------+------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table  | Non_unique | Key_name    | Seq_in_index | Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------------+------------+------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+---------+ 
| geneHomology |   0 | PRIMARY    |   1 | id      | A   | 680326661 |  NULL | NULL |  | BTREE  |   | 
| geneHomology |   1 | geneHomologyQuery_gene |   1 | gene_id     | A   |  1498516 |  NULL | NULL |  | BTREE  |   | 
| geneHomology |   1 | geneHomologyQuery_gene |   2 | genome_name    | A   |  1505147 |  NULL | NULL |  | BTREE  |   | 
| geneHomology |   1 | geneHomologyHit_gene |   1 | homolog_gene_id   | A   | 52332820 |  NULL | NULL |  | BTREE  |   | 
| geneHomology |   1 | geneHomologyHit_gene |   2 | homolog_genome_name  | A   | 52332820 |  NULL | NULL |  | BTREE  |   | 
+--------------+------------+------------------------+--------------+--------------------------+-----------+-------------+----------+--------+------+------------+---------+ 
5 rows in set (0.00 sec) 

UPDATE 4 Есть ли способ получить только частичные результаты, чтобы даже увидеть, что я получаю то, что хочу? Я пробовал LIMIT 1000 и даже LIMIT 10, но он ничего не меняет.

UPDATE 5

mysql> SHOW CREATE TABLE geneHomology; 
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table  | Create Table                                                                                                                                                                                                                                                              | 
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| geneHomology | CREATE TABLE `geneHomology` (
    `id` bigint(20) NOT NULL auto_increment, 
    `genome_name` varchar(20) NOT NULL, 
    `gene_id` varchar(30) NOT NULL, 
    `homolog_genome_name` varchar(20) NOT NULL, 
    `homolog_gene_id` varchar(30) NOT NULL, 
    `homolog_length` bigint(20) unsigned NOT NULL, 
    `significance` double unsigned NOT NULL, 
    `bit_score` double unsigned NOT NULL, 
    `percent_identity` double unsigned NOT NULL, 
    `start_match` int(10) unsigned NOT NULL, 
    `end_match` int(10) unsigned NOT NULL, 
    `start_match_percent` double unsigned NOT NULL, 
    `end_match_percent` double unsigned NOT NULL, 
    `strand` enum('+','-') default NULL, 
    `homolog_start_match` int(10) unsigned NOT NULL, 
    `homolog_end_match` int(10) unsigned NOT NULL, 
    `homolog_start_match_percent` double unsigned NOT NULL, 
    `homolog_end_match_percent` double unsigned NOT NULL, 
    `homolog_strand` enum('+','-') default NULL, 
    `consider_gene_homology` enum('0','1') NOT NULL, 
    `reason_not_considered` varchar(50) default NULL, 
    `num_hsps` int(10) unsigned NOT NULL, 
    `homology_type` varchar(2) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `geneHomologygene` (`gene_id`,`genome_name`), 
    KEY `geneHomologyhomolog_gene` (`homolog_gene_id`,`homolog_genome_name`) 
) ENGINE=MyISAM AUTO_INCREMENT=680326662 DEFAULT CHARSET=latin1 | 
+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SHOW CREATE TABLE gene; 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                                                                                                                                                                                                                                              | 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| gene | CREATE TABLE `gene` (
    `taxon_id` int(10) unsigned NOT NULL, 
    `genome_name` varchar(20) NOT NULL, 
    `gene_id` varchar(30) NOT NULL, 
    `symbol` varchar(30) default NULL, 
    `type` varchar(30) default NULL, 
    `product` varchar(300) default NULL, 
    `strand` enum('+','-') NOT NULL, 
    `start` bigint(20) unsigned NOT NULL, 
    `end` bigint(20) unsigned NOT NULL, 
    `gene_category` enum('Upregulated','Downregulated','Normal','n/a') NOT NULL, 
    `consider_gene` enum('0','1') NOT NULL, 
    `reason_not_considered` varchar(50) default NULL, 
    `sequence` longblob NOT NULL, 
    `additional_info` varchar(300) default NULL, 
    PRIMARY KEY (`gene_id`,`genome_name`), 
    KEY `gene_organism` (`taxon_id`), 
    KEY `gene_genome` (`genome_name`), 
    KEY `gene_gene_category` (`gene_category`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 
+0

попробуйте запустить объяснение по вашему запросу –

+1

, если вы используете соображение_оголога в предложении where, попробуйте индексировать этот столбец! –

+0

@ Хаим Евги: 1) см. Обновление для 'explain' 2) Я индексирую его сейчас, но я также попытался запустить запрос без него, который, похоже, не помог. –

ответ

1
SELECT a.genome_name, a.gene_id, 
     cats.gene_category, 
     (
     SELECT COUNT(*) 
     FROM geneHomology ab 
     JOIN gene b 
     ON  b.genome_name = ab.homolog_genome_name 
       AND b.gene_id = ab.homolog_gene_id 
     WHERE ab.genome_name = a.genome_name 
       AND ab.gene_id = a.gene_id 
       AND b.gene_category = cats.gene_category 
     ) cx 
FROM gene a 
CROSS JOIN 
     (
     SELECT 'Normal' AS gene_category 
     UNION ALL 
     SELECT 'Upregulated' AS gene_category 
     UNION ALL 
     SELECT 'Downregulated' AS gene_category 
     ) cats 
LIMIT 100 

Это удалит filesort из вашего плана.

Если у вас есть стол со всеми возможными gene_categories, замените его cats.

+0

+1 Спасибо, но он говорит: «ОШИБКА 1054 (42S22): Неизвестный столбец« ab.gene_id 'в' where clause '. –

+0

@ Давид: не могли бы вы опубликовать вывод 'SHOW CREATE TABLE geneHomology' и' SHOW CREATE TABLE gen'? – Quassnoi

+0

@Quassnoi: Конечно, см. Обновление 5 на OP. Еще раз спасибо за внимание. –

0

Из того, что Вы разместили здесь, я бы рекомендовал второстепенную немного денормализация и положить gene_category в geneHomolgy. Вы можете полностью избавиться от этого соединения, и вы можете создать индекс в полях your_homolog + GROUP BY.

0

Сначала удалите ссылку на genome_name из части WHERE запроса - если оба типа gene.gene_id и gene.genome_name уникальны, то здесь приведена явная функциональная зависимость, которая несколько путает проблему - объединение числа/числа будет быть незначительно mroe эффективным, что текст/текст присоединиться.

Глядя на план, скорее всего, у вас уже есть указатель на geneHomology.hit_gene_id. Если это так, то не так много возможностей для ускорения запроса без изменений схемы. Однако длина ключа 54 указывает на то, что в этом индексе есть много вещей, которых не должно быть. Обрезание этого до простого hit_gene_id и think_homolog поможет немного с производительностью, но ограничивающим фактором является то, что нет никакого способа избежать полного сканирования таблицы на ген, если в нем нет других функциональных зависимостей.

Как быстро нужно выполнить 'SELECT * FROM ген'? Сколько записей в ene_homology?

Похоже, что генГомология разлагает связь N: M между геном и геном (сама по себе) и применяет метки.

Если количество значений в homolog_genome_name относительно невелико, вы можете рассмотреть возможность разложения этого на ген с использованием растрового поля. Или, возможно, денормализовать связь в набор из 1: 1 сопоставлений. В качестве альтернативы вы можете перечислить кластеры гомолога.

+0

'SELECT * FROM gene' возвращается довольно быстро, но для печати требуется много времени, так как существует длинная строка, которая является последовательностью гена. 'SELECT genome_name, gene_id FROM gene;' возвращает '1560695 строк в наборе (3.37 сек)'. 'homolog_genome_name' имеет около 850 значений. Только пара «gene_id» и «genome_name» делает уникальный генный ключ (иногда встречаются гены с одним и тем же «gen_id», но в разных геномах). –

Смежные вопросы