Bonjour,
je dois faire une requête complexe en MySQL sur des tables relativement volumineuses. Rien que la première partie de ma requête prend plus de 40 min à tourner en local...
Donc si vous pouviez m'aider à l'optimiser ça serait supra cool.
Pour cette requête, j'utilise 4 tables dont voici les DESCRIBE :
et voici ma requete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 mysql> describe biset_cont_tag; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | bisetID | int(11) | YES | MUL | 0 | | | tagID | int(11) | YES | | 0 | | | discr_met | varchar(30) | YES | | | | | threshold | int(11) | YES | | 0 | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) mysql> describe hs_virtual_observed_tag; +------------------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------+------+-----+---------+-------+ | HsObservedTag_id | int(8) | NO | PRI | NULL | | | HsVirtualTag_id | int(8) | NO | PRI | NULL | | +------------------+--------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> describe hs_transcript_go; +----------------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+-------------+------+-----+---------+-------+ | Id | int(11) | NO | | 0 | | | gene_product | varchar(15) | YES | MUL | | | | description | mediumtext | YES | | NULL | | | gi_ref | int(11) | YES | | 0 | | | refseq | varchar(20) | YES | | | | | HsVirtualTag_id | int(11) | YES | | 0 | | | gene_product_aliases | text | YES | | NULL | | +----------------------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) mysql> DESCRIBE hs_transcription_factor; +---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+----------------+ | TF_id | int(8) | NO | PRI | NULL | auto_increment | | transfac_name | varchar(15) | NO | | NULL | | | gene_product | varchar(15) | NO | | NULL | | | mtx_id | int(8) | NO | | NULL | | | core_position | int(2) | NO | | NULL | | +---------------+-------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
Cette requête a mis 41min a me renvoyer le résultat (sans le DISTINCT que j'avais oublié), et 47sec en limitant les résultats à 10 enregistrements.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT DISTINCT bisetID FROM biset_cont_tag, hs_virtual_observed_tag WHERE tagID = hsobservedtag_id AND hsvirtualtag_id IN (SELECT DISTINCT hsvirtualtag_id FROM hs_transcript_go AS gene, hs_transcription_factor AS TF WHERE gene.gene_product = TF.gene_product);
Sachant que cette requête ne me permet que de récupérer la moitié de mon résultat, je panique un peu!
J'ai essayé en éliminant la sous requête au profit de deux jointures, mais c'est plus long (de même qu'en éliminant la jointure au profit d'une deuxième sous requête).
En cherchant sur le web, je vois qu'il est souvent question d'indexation pour optimiser les requêtes, mais je ne sais pas quel champs indexer ?
Tous les conseils seront les bienvenues.
Merci d'avance
Partager