Page 1 sur 1

Index

Posté : 01 févr. 2013, 17:35
par Ultim4T0m
Bonjour,

Je n'arrive pas à optimiser cette requête via des index.
SELECT COUNT( id ) AS nb
FROM table
WHERE (
id1 =  2066 -- INT(10)
OR id2 =  2066 -- INT(10)
)
AND etat =  '0' -- ENUM '0','1'
L'index suivant existe mais n'est pas utilisé :
id1, id2, etat
EXPLAIN me retourne ceci :
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table ALL indexes NULL NULL NULL 47096 Using where
Avez-vous une idée de la cause du problème ?
Vous manque t-il des informations pour pouvoir m'aider ?

Merci d'avance pour votre aide !
Ulti

Re: Index

Posté : 01 févr. 2013, 19:18
par moogli
salut,

as tu essayé un index par colonne ?

sinon peux tu nous fournir le ddl+ un jeux de données de test ?


@+

Re: Index

Posté : 04 févr. 2013, 17:07
par Ultim4T0m
Salut :)

Merci pour ta réponse.
Non, je n'ai pas tenté un index par colonne, je vais essayer ça ce soir (l'ajout d'un index sur la table met dans les 20 minutes et fait tout ramer, c'est relativement pénible >_<)
Une fois fais, je vous tiens au courant quant aux perfs !

Re: Index

Posté : 04 févr. 2013, 17:56
par Perine
Évite de mettre des enum pour des nombres comme 0 et 1. tinyint est plus adapté à ça.
La raison est que l'index de la première valeur pour une énumération est 1. Il peut donc y avoir une confusion assez simplement. C'est d'ailleurs déconseillé sur la doc de MySQL.

Code : Tout sélectionner

MariaDB [test]> create table test_enum (valeur enum('0', '1')); Query OK, 0 rows affected (0.08 sec) MariaDB [test]> insert into test_enum (valeur) values (1); Query OK, 1 row affected (0.02 sec) MariaDB [test]> select * from test_enum; +--------+ | valeur | +--------+ | 0 | +--------+ 1 row in set (0.00 sec)
Pour ce qui est de l'index, il est normal qu'il ne soit pas utilisé étant donné que la requête n'utilisera potentiellement que deux champs sur les trois. Il faut donc en effet poser deux ou trois index, en fonction de la disparité des données (deux: [(id1, etat), (id2, etat)], trois: [id1, id2, etat])