Bonjour,

Je fonctionne avec un moteur myisam.

Je dispose d'une table de 1 milliard de lignes avec un index sur 2 colonnes (disons, C1 et C2 ; C1 est un CHAR(8) et C2 est un champ DATETIME).

Si je fais un explain sur une requête dont la clause WHERE couvre C1 et C2, je vais bien utiliser l'index couvrant ces deux colonnes (300K lignes) : parfait.
Mais je cherche à améliorer les performances et à réduire la hauteur de ma table ...

J'ai donc créé une table qui ne contient que les informations filtrées sur 1 élément de C1 (C1 énumère 3000 éléments distincts) de la table précédente, cette table fait 1 million de lignes et dispose d'un index sur C2.
Si je fais un explain sur exactement la même requête (mais sans C1, puisque la valeur est fixée), je ne vais pas utiliser l'index et serait en full scan (1M lignes).

J'arriverai à utiliser l'index en réduisant l'intervalle sur C2 (ma clause WHERE fait un BETWEEN sur cette colonne), et je comprends que si l'index n'est pas utilisé c'est que l'index n'est pas très discriminant, par contre, je me demande, pourquoi il l'est dans ma table énorme.

L'analyseur va t-il regarder la sélectivité au prorata du nombre de ligne d'une table (300 000 lignes sur 1 000 000 000 - 0,03% ; c'est mieux que 300 000 lignes sur 1 000 000 - 30%) ?
Je pense que c'est de là que vient le souci...

Comment bien/mieux interpréter cela et comment mieux optimiser ma table du coup ?

Merci pour vos contributions