Bonjour,
Je cherche à optimiser l'accès à une table dont l'une des colonne indexée est filtrée par une clause between.
Lorsque j'interroge la table en direct, tout va bien, l'index est bien exploité.
En revanche lorsque je joins une table l'index n'est plus utilisé complètement.
Voici les tables avec leurs indexes:
C'est DONNEE.dt qui sera accédé via un between.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 create table CLEES(id1 int(11), id2 int(11)); create table DONNEES(id1 int(11), id2 int(11), dt bigint); create index ii on CLEES(id1, id2); create index ii on DONNEES(id1, id2, dt);
Petites précisions sur le contexte:
- Il y a plusieurs millions de lignes dans DONNEES
- CLEES est une table de travail temporaire et très petite (moins de 100 lignes en général)
Lorsque je fais une requête sur DONNEES avec un between:
Là il me dit type = range.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 describe select * from DATAS da where da.id1=0 and da.id2=0 and da.dt between 100000 and 100005;
A l'exécution, cette requête est instantanée.
Et lorsque je joins CLEES à DATAS:
Ici il me dit type = ref, il n'utilise plus l'index mais se limite à id1 et id2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 describe select da.* from CLEES cl inner join DATAS da on cl.id1=da.id1 and cl.id2=da.id2 where da.dt between 100000 and 100005;
A l'exécution, cette requête met entre 3 et 4 secondes.
J'ai fait OPTIMIZE et ANALYZE.
J'ai tenté de remplacer between par < et >.
Mais rien n'y fait.
Si quelqu'un a une idée, je suis preneur.
Merci.
Partager